Skip to content

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 循环和泛型转发