📜  c++中的decltype(1)

📅  最后修改于: 2023-12-03 14:59:50.195000             🧑  作者: Mango

C++中的decltype

在C++11标准中,decltype是一个核心的新特性,它可以让编译器在编译期间推断并返回表达式的类型,它的主要作用是解决模板编程过程中,模板参数的类型问题。

decltype关键字

使用decltype关键字,可以输出表达式的类型。

decltype(表达式) 变量名;

例如:

#include <iostream>

int main() {
    int a = 5;
    double b = 3.14;

    decltype(a) c = a + b;  // 推断出类型为int
    decltype(b) d = a + b;  // 推断出类型为double

    std::cout << "c: " << c << std::endl;  // 输出c: 8
    std::cout << "d: " << d << std::endl;  // 输出d: 8.14

    return 0;
}

代码中使用decltype关键字推断出a和b的表达式类型,将结果分别存储在变量c和d中。

decltype(auto)关键字

C++14添加了一个新的关键字decltype(auto) ,它允许推断出一个表达式的类型,并保留该表达式的“值性”和“引用性”。

decltype(auto) 变量名 = 表达式;

例如:

#include <iostream>

int main() {
    int a = 5;
    int& b = a;
    const int& c = a;

    decltype(auto) d = a;  // 推断出类型为int,是a的副本
    decltype(auto) e = b;  // 推断出类型为int&,是a的别名
    decltype(auto) f = c;  // 推断出类型为const int&,是a的常量别名

    d++;
    std::cout << "a: " << a << std::endl;  // 输出a: 5,d是a的副本
    e++ ;
    std::cout << "a: " << a << std::endl;  // 输出a: 6,e是a的别名
    // f++;  // compilation error

    return 0;
}

代码中使用decltype(auto)关键字分别推断出a、b和c的表达式类型,并存储在变量d、e和f中。其中,d是a的副本,e是a的别名,f是a的常量别名。

需要注意的是,用decltype(auto)推断出的变量类型可能是引用类型,也可能是值类型,这个取决于所推断的表达式的值类型。但是,由于引用类型是可以绑定到表达式的,所以这样的推断有时候是非常有用的。