decltype在编译期推导表达式原样类型且不求值,严格保留引用/const/volatile,适用于泛型、模板元编程及复杂类型简化。

decltype 用来在编译期推导出一个表达式的类型,且不求值该表达式。它不关心变量的值或运行时行为,只看表达式的语法形式和声明信息,特别适合写泛型代码、模板元编程、以及需要精确保留引用/const/volatile属性的场景。
推导表达式的“原样类型”
不同于 auto 会忽略引用和顶层 const,decltype 严格保留表达式的类型细节:
- int x = 42; → decltype(x) 是 int(变量名,取类型)
- const int& y = x; → decltype(y) 是 const int&(带引用和 const)
- decltype(x + y) 是 int(纯右值表达式,结果是 int,非引用)
- decltype((x)) 是 int&(加括号变成左值表达式,推导为引用)
在模板中辅助返回类型推导
当函数返回类型依赖于参数表达式时,decltype 可与 auto 结合使用(C++14 后可省略,但 C++11 必须):
- template
- auto add(T&& t, U&& u) -> decltype(t + u) { return t + u; }
- 这样能确保返回类型和 t + u 的实际类型完全一致,支持自定义类型重载 operator+ 的情况
配合 typedef / using 简化复杂类型声明
避免手动写出冗长嵌套类型,尤其在涉及迭代器、lambda、模板嵌套时:
立即学习“C++免费学习笔记(深入)”;
- std::vector<:string> v;
- using iter = decltype(v.begin()); // 推出 std::vector<:string>::iterator
- decltype([](int x){ return x * 2; }) my_lambda; // 获取 lambda 独有类型
注意:decltype 不执行表达式
decltype 只做类型分析,不触发副作用或计算:
- int i = 0;
- decltype(i++) j; → 合法!i++ 不会被执行,j 类型是 int(因为 i++ 返回的是 int 类型的右值)
- 这使得它安全用于未定义行为或昂贵操作的类型查询
基本上就这些。用好 decltype,能让泛型接口更精准,模板代码更健壮,也更贴近“写什么就是什么”的类型直觉。










