美文网首页
[C++11阅读][3-3-2]decltype类型推导(上)

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

作者: 凌霄阁2010 | 来源:发表于2020-07-04 07:37 被阅读0次

表达式推导

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

相关文章

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

    表达式推导 如下面的例子,decltype的类型推导并不是像auto一样从变量声明的初始化获得变量类型,而是以一个...

  • C++11的类型推导详解

    auto & decltype 关于C++11新特性,最先提到的肯定是类型推导,C++11引入了auto和decl...

  • C++11类型推导

    C++11 重新定义了auto 和 decltype 这两个关键字实现了类型推导,让编译器来操心变量的类型。 au...

  • C++11中auto和decltype

    C++11中auto和decltype auto和decltype都是C++11中引进来用于自动推断类型的关键字,...

  • 模板函数返回类型的演进

    提纲 c++03: trick 方法 c++11: auto->decltype 组合 c++14: 自动推导模板...

  • C++11 类型推导,auto和decltype

    本文根据众多互联网博客内容整理后形成,引用内容的版权归原始作者所有,仅限于学习研究使用,不得用于任何商业用途。 a...

  • decltype关键字

    C++11新标准学习:decltype关键字 1. decltype的意义 有时我们希望从表达式的类型推断出要定义...

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

    引子 decltype类型推导还挺复杂,有时候会出一些奇怪的错误,比如下面的程序编译不过,因为括号里的i推导成引用...

  • [C++11阅读][3-3-4]decltype类型推导(下)

    cv限制符 decltype可以带走cv限制符,这一点跟auto不同,auto带不走。但cv限制符不会扩散到成员变...

  • nullptr

    decltype 用于类型推导,而 std::is_same 用于比较两个类型是否相同. 将输出: 结论 NULL...

网友评论

      本文标题:[C++11阅读][3-3-2]decltype类型推导(上)

      本文链接:https://www.haomeiwen.com/subject/omeeqktx.html