c++中的decltype
GPT的回答如下:
decltype 是 C++11 引入的一个关键字,它的作用是:“获取一个表达式的类型”。
你可以把它看作是一种编译时类型推导工具,常和 auto、模板、泛型编程等一起使用。
🔍 基本语法
decltype(expression) // 表达式的类型
它会告诉你 expression 的 类型是什么,但不计算该表达式的值。
✅ 示例 1:和变量一起用
int x = 5;
decltype(x) y = 10; // y 的类型是 int
和下面写法效果一样:
int y = 10;
✅ 示例 2:和函数返回值结合
int add(int a, int b) { return a + b; }
decltype(add(1, 2)) result = 3; // result 是 int
✅ 示例 3:结合 auto 和 decltype 使用推导类型
auto a = 5;
decltype(a) b = 10; // b 是 int
✅ 示例 4:函数指针类型获取(你问的场景)
bool cmp(int a, int b) { return a < b; }
decltype(&cmp) funcPtr = &cmp; // funcPtr 是 bool (*)(int, int)
✅ 示例 5:获取表达式类型但不求值
int i = 42;
decltype(i + 1) x = 100; // x 是 int
decltype 不求值:即使你写的是 decltype(f()),它也不会真的调用 f(),只会分析返回类型。
⚠️ 注意点
-
decltype(x)是 x 的类型,但和auto不同,它保留 const、引用 属性。int a = 5; int& ra = a; decltype(ra) b = a; // b 是 int&,不是 int -
空表达式的
decltype:decltype((x)) y = x; // 是 int&,因为 (x) 是左值 decltype(x) z = x; // 是 int
🔧 小技巧:常用于泛型和模板中
template <typename T, typename U>
auto add(T t, U u) -> decltype(t + u) {
return t + u;
}
✅ 总结
| 用法 | 解释 |
|---|---|
decltype(x) |
x 的类型(保留引用和 const) |
decltype((x)) |
更严格:如果 x 是左值,结果是引用类型 |
decltype(func()) |
获取函数返回类型(不会真的调用) |
decltype(&cmp) |
获取函数指针类型 |
decltype(lambda) |
获取 lambda 表达式的类型(通常配合 auto 和模板使用) |
如果你有具体场景(比如 priority_queue、模板类等)想了解 decltype 的用法,我可以给你定制讲解。要不要?

浙公网安备 33010602011771号