int i = 10; auto a = i, &b = i, *c = &i; // a是int,b是i的引用,c是i的指针,auto就相当于int auto d = 0, f = 1.0; // error,0和1.0类型不同,对于编译器有二义性,没法推导 auto e; // error,使用auto必须马上初始化,否则无法推导类型
代码2:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15
void func(auto value) {} // error,auto不能用作函数参数
class A { auto a = 1; // error,在类中auto不能用作非静态成员变量 static auto b = 1; // error,这里与auto无关,正常static int b = 1也不可以 static const auto c = 1; // ok };
void func2() { int a[10] = {0}; auto b = a; // ok auto c[10] = a; // error,auto不能定义数组,可以定义指针 vector<int> d; vector<auto> f = d; // error,auto无法推导出模板参数 }
总结一下auto的限制:
auto的使用必须马上初始化,否则无法推导出类型
auto在一行定义多个变量时,各个变量的推导不能产生二义性,否则编译失败
auto不能用作函数参数
在类中auto不能用作非静态成员变量
auto不能定义数组,可以定义指针
auto无法推导出模板参数
再看这段代码:
1 2 3 4 5 6 7 8 9 10
int i = 0; auto *a = &i; // a是int* auto &b = i; // b是int& auto c = b; // c是int,忽略了引用
const auto d = i; // d是const int auto e = d; // e是int
const auto& f = e; // f是const int& auto &g = f; // g是const int&