写代码有时会遇到这种情况:希望从表达式的类型推断出要定义的变量的类型,但是不想用该表达式的值初始化变量。
为了满足这一要求,c++标准引入了decltype运算符。它的作用是选择并返回操作数的数据类型。在此过程中,编译器分析表达式并得到它的类型,却不实际计算表达式的值。
const int c1 = 0;
const int& c2 = c1;
decltype(c1) x = 0; // x的类型是 const int
decltype(c2) y = x; // y的类型是 const int&,y 绑定到 x
decltype(c2) z; // 编译错误,z 是一个引用,必须初始化
注意:如果表达式的内容是解引用操作,则decltype得到的类型为引用类型。
int t = 1;
int* p = &t;
decltype(*p) x = test; // x 的类型为引用类型,而非int
切记:decltype((variavle))(注意是双层括号)的结果永远是引用,而decltype(variable)结果只有当variable本身就是一个引用时才是引用。
int t = 1;
decltype(t) x = 0; // 正确,x 是一个未初始化的 int
decltype((t)) y; // 错误,y 的类型是 int& 必须初始化,如:decltype((test)) y = x;