C++中的类型推断
C++11中引入了auto和decltype,他们可以在编译期推导出出变量或表达式的类型,大幅简化了代码。
auto
auto关键字允许编译器在编译期间自动推导出变量的类型。
1 | |
推导规则
auto变量必须在声明时立即初始化- 当一行中声明了多个
auto变量时,他们必须能够从一个共同的初始化表达式中推导出相同类型。 - 在推导类型时,
auto会忽略等号右边的const、volatile(cv)属性和引用类型,除非显式地声明为引用或指针。 auto不能用作函数的参数auto无法作为模板auto在类中不能用作非静态的成员变量auto不能用于定义数组
1 | |
decltype
与auto不同,decltype用于推导表达式的类型而非变量的类型。其在编译期间发挥分析表达式的类型,但是表达式本身不会进行运算。
1 | |
推导规则
- 如果
exp是一个没有圆括号的标识符表达式(id-expression),例如变量名、函数名和枚举常量名,那么decltype(exp)的类型与exp的类型相同。例如上面代码中的decltype(x)推导出的类型是int,这是因为decltype(x)和decltype((x))是不同的类型- 当
x是变量名时,decltype直接获取该变量的声明类型,结果包含原始的const限定符、引用类型等修饰符。 - 当表达式是
(x)(带括号)时,C++ 将其视为普通左值表达式,decltype会推导出表达式结果类型和值类别,对命名变量使用括号会添加引用。
- 当
- 如果
exp是函数调用,则decltype(exp)的类型与函数返回值的类型相同。 - 如果
exp是左值,则decltype(exp)是exp类型的左值引用- 注意和第一种情况的辨析
- 与
auto不同,decltype会保留exp的cv属性和引用类型
1 | |
decltype常和auto一起配合使用。比如处理复杂的类型和模板编程
1 | |
以及推导函数返回值的类型
1 | |
需要注意
1 | |
这段代码在C++11上是编译不过的,因为函数的返回类型是在参数名可见之前就解析的,也就是说编译器会先解析decltype(t + u),而此时t和u尚未定义,这就导致了编译器无法编译decltype(t + u),出现错误。
C++中的类型推断
https://guts.homes/2025/06/12/cpp-auto-decltype/