类型提示符的原理:
选择并返回操作数的数据结构,在此过程中,编译器分析表达式并得到它的类型,却不实际计算表达式的值。
使用方式:
int num = 0;
decltype(num++) sun = 7;
cout << num << " " << sun << endl;
结果输出0 7,decltype分析但不计算表达式 (num++) 的数据类型作为sun的数据类型,并将 7 作为初始值赋值为sun。
decltype处理方式:
- 当decltype使用的表达式是一个变量,则返回该变量的类型(包括顶层const和引用)
const int ci = 0, &cj = ci;
decltype(ci) x = 0; // x的类型是const int
decltype(cj) y = x; // y的类型是const int&,将y绑定到x上
decltype(cj) z; // 错误,z是一个引用,必须初始化
注意示例:
引用从来都是以所指对象的同义词出现,只有decltype是一个例外。
- 当decltype的表达式不是一个变量,则decltype返回表达式结果对应的类型。
int i = 42, *p = &i, &r = i;
decltype(r + 0) b; // 正确,加法的结果是int,因此b是一个未初始化的int
decltype(*p) c; // 错误,*p是取出p里面的值,而p存储的是i的地址,所以c是int&,必须初始化
- decltype表达式加括号与不加括号的区别
decltype(i) d; // 正确,d是一个未初始化的int
decltype((i)) e; // 错误,e是int&,必须初始化
如果表达式是不加括号的变量,则得到的结果是该变量的类型;
如果表达式是加一个或者多个括号的变量,则编译器会把它当作一个表达式,变量是一种可以作为赋值语句左值的特殊表达式,所以此时decltype得到的是引用类型。