1、 auto
C++11新标准引入了auto类型说明符,它让编译器通过初始值来推断变量的类型,因此auto定义的变量必须有初始值:
auto a=1; //正确,a的类型为整型
auto b; //错误,b没有初始值,无法推断b的类型
当使用auto声明多个变量时,该语句中所有变量的初始基本数据类型必须一样:
auto a=1,b=2; //正确,a、b都是整型
auto c=1,d=1.4; //错误,a、b类型不一样
当初始值是引用时,编译器以引用对象的类型作为auto的类型:
auto i=0,&r=i;
auto a=r; //r是一个整数
另外,auto一般会忽略顶层const,保留底层const:
const int i=0,&r=i;
auto a=i; //a是一个整数(i的顶层const被忽略掉了,如果没有忽略,a应该是整型常量)
auto b=r; //b是一个整数(r是i的别名)
auto c=&i; //c是一个指向整数常量的指针(r是底层const,保留)
如果希望推断出的auto类型是一个顶层const:
const auto d=i; //i的推演类型是int,d是const int
2、decltype
类型说明符decltype能选择并返回操作数的数据类型,编译器通过分析表达式得到它的类型,不用计算表达式的值:
decltype(f()) sum=x; //sum的类型是函数f的返回类型
在处理顶层const和引用时与auto不同
const int i=1,&r=i;
decltype(i) a=0; //a的类型是const int,此时顶层const 被保留)
decltype(r) b=a; //b的类型是const int&
另外还有一种情况需要注意,如果decltype表达式中的变量名加上一层或多层括号,则表示引用
decltype((i)) c; //错误,c是一个引用,必须初始化