1、auto类型说明符
(1)auto是让编译器通过初始值来推算变量的类型,因此auto定义的变量必须要有初始值。 (2)auto可以在一条语句中声明多个变量,其中多个边的初始基本数据类型必须一样。 (3)auto 会忽略掉顶层的const,保留底层的const。 例如:
int i=0;
const int a=i;
auto b=a;
auto c=&a;
(4) 设置一个类型为auto 的引用时,初始值中的顶层常量属性仍然保留。 例如:
auto &d=a;
2、decltype 类型指示符
(1)decltype能够从表达式的类型推断出要定义的变量的类型,所以不一定用该表达式的值初始化变量。 例如:编译器并不需要调用某个函数,而是可以通过该函数的返回类型来确定需要定义的变量的类型。 (2)如果decltype使用的表达式是一个变量,则decltype返回该变量的类型(包括顶层const和引用在内)。 例如:
const int a=0,&b=a;
decltype(a) x = 0;
decltype(b) y = x;
(3)decltype和引用之间需要注意的问题: ①如果decltype使用的表达式不是一个变量,那么decltype返回表达式结果对应的类型。 ②如果表达式的内容是解引用操作,则decltype的结果是引用类型。 原因是:解引用指针可以得到指针所指的对象,而且还能给这个对象赋值,所以decltype(*p)的结果是int&,而非int. 例如:
int i=1,*p=&i,&r=i;
decltype(r+1) b;
decltype(*p) c;
③decltype的表达式如果是加上了括号的变量,结果将是引用。 原因是:加上括号,编译器会把它当成一个表达式,变量是一种可以作为赋值语句左值的特殊表达式,所以 这样的decltype就会得到引用类型。 例如:
decltype((i)) d;
decltype(i) e;
|