文章摘要
Deepseek-v3.2

在 C++ 中,auto&& 是一个转发引用(forwarding reference),它有两个主要作用:

1. 通用引用

auto&& 可以绑定到任何类型的值:

  • 左值 (lvalue)
  • 右值 (rvalue)
  • const/非const
auto&& x1 = 42;           // 绑定到右值
int y = 10;
auto&& x2 = y; // 绑定到左值
const int z = 20;
auto&& x3 = z; // 绑定到const左值

2. 在递归 lambda 中的特殊作用

在你的代码中:

auto solve = [&](auto&& self, i64 i, i64 j) -> i64 {
// ...
dp[i][j] = self(self, i - 1, j);
// ...
};

这里的 auto&& self 允许:

  • 完美转发:保持参数的值类别(左值/右值)
  • 类型推导:自动推导出 lambda 自身的类型
  • 避免拷贝:引用传递,不会产生额外的拷贝开销

3. 为什么需要两个 &

如果只用 auto&

auto solve = [&](auto& self, i64 i, i64 j) -> i64 {
// 只能绑定到左值,可能无法处理某些情况
};

如果只用 auto

auto solve = [&](auto self, i64 i, i64 j) -> i64 {
// 会产生拷贝,可能效率较低
};

auto&& 结合了两种优点:

  • ✅ 无拷贝开销
  • ✅ 可以处理所有值类别
  • ✅ 支持完美的类型推导

4. 简单理解

你可以把 auto&& self 理解为:

“无论传入的是什么类型、什么值类别的参数,我都能正确处理”

这在递归 lambda 中特别有用,因为它需要精确地传递自身的类型来进行递归调用。