一、关键词
- 从表达式的类型推断出要定义的变量的类型
示例:decltype(i) x = 0; //等价于int x = 0;
二、复合类型、const
const int ci = i, &cj = ci; decltype(ci) x = 0; //保留顶层const,x的类型是const int decltype(cj) y = x; //y的类型是const int &,而不是ci的类型,y绑定到变量x decltype(cj) z; //错误:z是一个引用,必须初始化
1. 引用
和auto不同,当表达式为一个引用别名时,它不会将类型声明为该别名所绑定的对象的类型,而是保留为引用的类型。
2. const
和auto不同,它可以保留顶层const。
三、decltype和引用
如果decltype使用的表达式不是一个变量,则decltype返回表达式结果对应的类型。
注:有些表达式会向decltype返回一个引用类型,这一般意味着该表达式的结果对象可以作为一条赋值语句的左值。
1. 如果表达式的内容是解引用操作,则decltype将得到引用类型。
如:int i = 3, *p = &i; decltype(*p) c = i; //c是int &,必须初始化
2. 如果给变量加上一层或多层括号,编译器会把它当作一个表达式,同样会得到引用类型。
如:decltype((i)) d = i; //d是int &,必须初始化
【补充】
举例:使用关键字decltype的时候,其表达式的求值结果若是左值,decltype作用于该表达式(不能是变量)得到一个引用类型。例如,p的类型是int *,因为解引用运算符生成左值,所以decltype(*p)的结果是int &。而另一方面,因为取地址运算符生成右值,所以decltype(&p)的结果是int **,即结果是一个指向整型指针的指针。