C++11特性:auto关键字

https://www.cnblogs.com/QG-whz/p/4951177.html

注意事项
1. auto 变量必须在定义时初始化,这类似于const关键字。
定义在一个auto序列的变量必须始终推导成同一类型。例如:

auto a4 = 10, a5 = 20, a6 = 30;//正确
auto b4 = 10, b5 = 20.0, b6 = 'a';//错误,没有推导为同一类型

2.使用auto关键字做类型自动推导时,依次施加一下规则:

如果初始化表达式是引用,则去除引用语义。

int a = 10;
int &b = a;

auto c = b;//c的类型为int而非int&(去除引用)
auto &d = b;//此时c的类型才为int&

c = 100;//a =10;
d = 100;//a =100;
如果初始化表达式为const或volatile(或者两者兼有),则除去const/volatile语义。

const int a1 = 10;
auto b1= a1; //b1的类型为int而非const int(去除const)
const auto c1 = a1;//此时c1的类型为const int
b1 = 100;//合法
c1 = 100;//非法
如果auto关键字带上&号,则不去除const语意。

const int a2 = 10;
auto &b2 = a2;//因为auto带上&,故不去除const,b2类型为const int
b2 = 10; //非法
这是因为如何去掉了const,则b2为a2的非const引用,通过b2可以改变a2的值,则显然是不合理的。
初始化表达式为数组时,auto关键字推导类型为指针。

int a3[3] = { 1, 2, 3 };
auto b3 = a3;
cout << typeid(b3).name() << endl;
程序将输出

int *
若表达式为数组且auto带上&,则推导类型为数组类型。

int a7[3] = { 1, 2, 3 };
auto & b7 = a7;
cout << typeid(b7).name() << endl;
程序输出

int [3]

3. 函数或者模板参数不能被声明为auto

void func(auto a) //错误
{
//...
}

4. 时刻要注意auto并不是一个真正的类型。
auto仅仅是一个占位符,它并不是一个真正的类型,不能使用一些以类型为操作数的操作符,如sizeof或者typeid。

cout << sizeof(auto) << endl;//错误
cout << typeid(auto).name() << endl;//错误

发表评论

电子邮件地址不会被公开。 必填项已用*标注

2 × 2 =

91 − 82 =