auto推导类型原则
auto
是 C++11 引入的类型自动推导关键字,它允许编译器根据表达式的类型来推导变量的确切类型。虽然使用 auto
可以让代码更简洁,但理解它的类型推导规则非常关键,尤其是在涉及指针、引用、const、模板等场景时。
✅ 一、基本推导原则
auto x = expression;
编译器根据 expression
的 值类型 推导出 x
的 精确类型(类似函数模板参数推导)。
🔸二、常见推导规则总结表
表达式类型 | 推导结果 | 说明 |
---|---|---|
值类型(int, double) | 相同类型 | 基础类型正常推导 |
引用类型(int&) | 去掉引用 | auto 默认不会保留引用 |
const 值 | 去掉 const | auto 默认不会保留顶层 const |
指针类型 | 保留指针类型 | auto p = &x; 推导为 int* |
const 指针 | 保留指针本身的 const,但去掉指向对象的顶层 const |
🔹三、关键例子:值/引用/const
1. 默认去引用、去顶层 const
int a = 10; const int b = 20; auto x = a; // int auto y = b; // int (const 被去掉)
2. 显式保留引用(用 auto&
)
int a = 10; auto& x = a; // int&,引用保留 const auto& y = a; // const int&,也保留 const
🔹四、数组与函数类型推导
1. 数组会退化为指针
int arr[3] = {1, 2, 3}; auto x = arr; // int*,数组退化成指针 auto& y = arr; // int(&)[3],引用才保留数组类型
2. 函数也会退化为函数指针
void func(int) {} auto x = func; // void(*)(int) auto& y = func; // void(&)(int)
🔹五、auto
vs decltype(auto)
关键字 | 推导方式 |
---|---|
auto | 类似模板参数推导(去引用、const) |
decltype(auto) | 完全等价于表达式的类型(保留引用、const) |
int a = 42; int& ra = a; auto x = ra; // int(去掉引用) decltype(auto) y = ra; // int&(保留引用)
🔹六、auto
与范围 for 循环
1. 正确使用 auto&
防止拷贝:
std::vector<int> v = {1, 2, 3}; for (auto x : v) { x += 1; // 拷贝,每次循环操作副本 } for (auto& x : v) { x += 1; // 引用,直接修改原始元素 }
🔹七、配合 const
使用
-
auto
不保留顶层 const,需要显式加上:
const auto x = expr; // x 是 const const auto& y = expr; // const 引用
✅ 八、小结:auto
推导的三个关键“默认行为”
特性 | 是否保留 | 说明 |
---|---|---|
引用 | ❌(默认不保留) | auto 默认推导为值类型 |
顶层 const | ❌(默认不保留) | 推导为非 const |
指针 / 函数 / 数组 | ✅(但有退化) | 数组退化为指针,函数退化为函数指针 |