类型说明符auto
2023年12月14日 2023年12月31日
使用赋值运算符: 根据右侧表达式推断变量类型
变量类型由两部分共同决定:
- 右侧表达式结果的具体类型
- 左侧使用的声明符
如const限定符, 类型修饰符:*
,&
, 和&&
1auto v = expr;
使用auto定义多个变量时, 这些变量的基本类型必须一致
使用表达式结果的具体类型和值
- 表达式结果为对象
1int a = 5, &r = a; 2auto b = r; // 表达式结果为对象, b的类型和值与该对象一致
- 表达式结果为值
1auto a = 5; // 表达式结果为值, a的类型为int, 值为5
忽略顶层const, 保留底层const
-
如果表达式结果为具有顶层const的对象, 忽略顶层const
表达式结果为对象1const int ci = 4; 2auto i = ci; // i的类型是int
-
如果表达式结果为具有底层const的指针, 保留底层const
1const int ci = 4, *p = &ci; 2auto p2 = p; // p2的类型为const int * 3auto p3 = &ci; // p3具有底层const
使用auto定义具有顶层const的对象
左侧使用 const
限定符
1const auto ci = 3; // ci的类型是const int
使用auto定义指针
此时, 赋值运算符右侧的表达式结果的具体类型为指针
-
表达式结果的具体类型为指针
1int a = 5, *p = &a; 2auto p2 = p; // p2是指针 3auto p3 = &a; // 取地址运算符返回一个指针值, p3是指针
-
左侧使用类型修饰符
*
, 要求右侧表达式结果的具体类型为指针1int a = 5, *p2 = &a; 2auto *p4 = p2; // p4是指针
取地址符的运算对象具有顶层const, 则指针具有底层const
1const int ci = 4; 2auto p = &ci; // p类型为const int *
表达式结果为具有底层const的指针对象, 则左侧指针亦具有底层const
1const int ci = 4, *cp = ci; 2auto cp2 = cp;
使用auto定义左值引用
- 左侧使用类型修饰符
&
, 要求右侧表达式为左值 - 如果右侧表达式是左值, 左侧使用类型修饰符
&&
也将得到一个左值引用
1int a = 5, &r = a; 2auto &r2 = a; // r2的类型是int & 3auto &&r3 = b; // r3的类型是int &
如果表达式结果为具有顶层const的对象, 左值引用具有底层const
1const int ci = 4; 2auto &cr = ci; // cr的类型是const int & 3const auto &cr2 = ci; // cr2的类型是const int &
使用auto定义右值引用
使用类型修饰符 &&
,要求右侧表达式是右值