表达式推导
如下面的例子,decltype的类型推导并不是像auto一样从变量声明的初始化获得变量类型,而是以一个普通的表达式作为参数,返回该表达式的类型。
#include <typeinfo>
#include <iostream>
using namespace std;
int main() {
int i;
decltype(i) j = 0;
cout << typeid(j).name() << endl; // i
float a;
double b;
decltype(a+b) c;
cout << typeid(c).name() << endl; // d
}
与auto相同的一点是,decltype的类型推导发生在编译时。
decltype与typedef/using合用
decltype的一个常见用法是与typedef/using合用,得到一个类型别名。
using size_t = decltype(sizeof(0));
using ptrdiff_t = decltype((int*)0 - (int*)0);
using nullptr_t = decltype(nullptr);
重用匿名类型
说的是decltype可以从匿名类型的变量中提取出类型。
但这是书里一个错误的例子,实测enum class并不能匿名,会编译报错。
enum class{K1, K2, K3}anon_e;
union {
decltype(anon_e) key;
char* name:
}anon_u;
struct {
int d;
decltype(anon_u) id;
}anon_s[100];
int main() {
decltype(anon_s) as;
as[0].id.key = decltype(anon_e)::K1;
}
// cpp.cpp:1:11: error: anonymous scoped enum is not allowed