auto
关键字在
C
语言中就已经存在了,只不过在
C
语言中它的作用是声明自动变量,例如
auto int z = 123 ;
z
本来是局部变量,加上
auto
后变成了局部的自动变量,就是当前变量的生存周期是由编译器自动决定的,但是这和局部变量没有区别,所以
auto
在
C
语言中并没有发挥什么作用。
在 C++11 中,就赋予了 auto 一个新的功能-自动类型推导。auto 声明的变量必须由编译器在编译时期推导而得,简单来说就是由编译器来识别变量的类型。
注意:使用 auto
定义变量时必须对其进行
初始化
,在编译阶段编译器需要根据初始化表达式来推导 auto
的实际类型。因此
auto
并非是一种
“
类型
”
的声明,而是一个类型声明时的
“
占位符”
,编译器在编译期会将
auto
替换为变量实际的类型。
auto a; //错误,使用 auto 初始化变量必须赋值
auto 使用注意事项
1.不能作为函数参数,例:
void func(auto x, auto y) {}
void func(auto x, double y) {}
int main()
{
func(1, 2);
func(1.2, 1.2);
return 0;
}
编译报错,影响重载形式下的调用绑定
2.无法作为模板参数
3.无法定义数组
4.不能定义类中的非静态成员变量
5. 当在同一行声明多个变量时,这些变量必须是
相同的类型
,否则编译器将会报错,因为编译
器实际只对第一个类型进行推导,然后用推导出来的类型定义其他变量。
void TestAuto()
{
auto a = 1, b = 2;
auto c = 3, d = 4.0; // 该行代码会编译失败,因为 c 和 d 的初始化表达式类型同
}
6.
用 auto 声明指针类型时,用 auto 和 auto*
没有任何区别
,但用 auto 声明引用类型时则必须加&,例:
int main()
{
int x = 10;
auto a = &x;//与下面 auto* 声明没有区别
auto* b = &x; //与上面 auto 声明没有区别
auto c = x; //auto 推导出来是一个 int 型,c 并不会是 x 的引用
auto& c = x; //正确写法
return 0;
}
7.auto 会自动去除 const 属性,解释如下:
int main(int argc, char const *argv[])
{
const int a = 10;
auto b = a; //b 为 int,不会推导为 const int
auto c = 'A'; //c 推导为 char,不会推导会 const char
auto &d = a; //这个时候 d 就会带 const 属性了,因为它是 a 的引用
return 0;
}