1.auto不能用来声明,只是一个类型声明的占位符,使用auto声明的变量必须马上初始化,让编译器推断出变量的实际类型,在编译阶段将auto替换成真正类型。
auto x;//error
2.auto推导规则:
可以同指针,引用结合起来,还可以带上cv限定符(const和volatile)
1)当不声明为指针或引用时,auto的推导结果会抛弃cv限定符。
example:
int x = 10;
const auto e = x; // e->const int, auto 为int
auto f = e; // f->int, 因为f不是引用或指针,auto把const属性抛弃掉,推导成non-const
const auto& g = x; // g->const int&
auto& h = g; // h->const int&, 因为h是引用类型,auto不会抛弃掉const属性
3.auto的限制:
1)不能用于函数形式参数
2)auto不能用于非静态成员变量(不懂为何)
3)auto无法定义数组
int arr[10] = {0};
auto rr[10] = arr; //error
4.合适用auto
1)在返回值类型确定时用auto
2)用于泛型编程:
example:
class Foo
{
public: static int get() { return 0; }
};
class Bar
{
public: static const char* get() { return "0"; }
};
template <class A>
void func()
{
auto val = A::get();
}