decltype 关键字
称为类型指示符
为什么存在?
由编译器从表达式的类型推断出要定义变量的类型,但不想用该表达式的值作为初始化(即不执行表达式)
举个栗子
int *p = nullptr;
decltype(1) a; // int
decltype(1.0) b; // double
decltype('1') c; // char
decltype(&a) d; // int *
decltype((a)) f; // int &
decltype(*p) g; // int &
decltype(nullptr) h; // int &
这里解释一下为什么 decltype(*p) 的类型结果是引用类型
int a = 10;
int *p = &a;
我们对 *p 赋值,就会改变 a 的值,例如 *p = 20;那么 a 的值就变成了 20;
解引用操作实质就是得到指针所指的对象,并且对它赋值实质就是对 a 赋值
因此,decltype(*p) 的结果类型就是引用类型 int&,而非 int
小结
decltype((variable)) 的推导结果永远是引用(用括号括住)
decltype(variable) 的推导结果只有当 variable 是引用的时候才是引用