📅  最后修改于: 2023-12-03 14:59:50.195000             🧑  作者: Mango
在C++11标准中,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中。
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)推断出的变量类型可能是引用类型,也可能是值类型,这个取决于所推断的表达式的值类型。但是,由于引用类型是可以绑定到表达式的,所以这样的推断有时候是非常有用的。