文章摘要
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 中特别有用,因为它需要精确地传递自身的类型来进行递归调用。