[C++11阅读][3-3-2]decltype类型推导(上)

表达式推导

如下面的例子,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
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。