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

2020-07-04  本文已影响0人  凌霄阁2010

表达式推导

如下面的例子,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
上一篇 下一篇

猜你喜欢

热点阅读