auto、auto&、auto&& 的含义和区别?
auto
值类型推导——创建对象的副本。
cpp
int x = 42;
auto a = x; // a 是 int- 推导出值类型,忽略引用和顶层
const - 数组退化为指针
auto&
左值引用推导——创建原对象的别名
cpp
int x {42};
auto& r = x; // r 是 int&,绑定到 x
r = 100; // x 也变成 100
auto r2 = 42; // 编译错误,不能绑定右值- 保留顶层
const - 保持数组类型
- 绑定到左值,不产生拷贝,无法绑定到右值
- 适合需要修改原对象,或避免拷贝大对象
auto&&
万能引用推导——用于处理泛型编程,处理未知值类别。
- 左值 推导为 左值引用
- 右值 推导为 右值引用
cpp
int x {42};
auto&& r1 = x; // r1 是 int&(绑定左值)
auto&& r2 = 42; // r2 是 int&&(绑定到右值)
auto&& r3 = getVec(); // r3 是 vector<int>&&- 保留顶层
const - 保持数组类型
- 结合引用折叠规则,既能绑定左值又能绑定右值
- 不产生拷贝,延长临时对象生命周期
- 常用于范围 for 循环和泛型转发