C++23 允许将 lambda 定义为
static
。即,如果 lambda 没有捕获任何内容,则可以将其定义为 static
:
// with superfluous argument `this`, less efficient.
auto fn1 = [](int a, int b) { return a + b; };
// no argument `this`, more efficient!
auto fn2 = [](int a, int b) static { return a + b; };
我只是想知道:
为什么 C++ 标准不默认将不捕获任何内容的 lambda 定义为
?static
当 lambda 被引入时,没有人考虑到这一点。当他们在 C++23 中遇到这个问题时,更改 C++11 的默认行为已经晚了。他们无法改变行为的原因在 P1169R2
中有描述但是,我们不能简单地更改此类 lambda,因为这可能会破坏代码。存在采用可调用类型的模板参数并执行
的代码,期望结果类型是指向成员类型的指针(这是现在唯一可以做的事情)。如果我们将无捕获 lambda 更改为隐式具有静态调用运算符,则所有此类代码都会因无捕获 lambda 而中断。此外,这将是语言 ABI 中断。虽然 lambda 无论如何都不应该出现在您的 ABI 中,但我们不能自信地说这样的代码不存在,也不应该破坏这样的代码。decltype(&F::operator())