为什么 C++ 标准不隐式定义默认情况下不捕获任何内容的 lambda 为“static”?

问题描述 投票:0回答:1

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

c++ lambda static standards c++23
1个回答
0
投票

当 lambda 被引入时,没有人考虑到这一点。当他们在 C++23 中遇到这个问题时,更改 C++11 的默认行为已经晚了。他们无法改变行为的原因在 P1169R2

中有描述

但是,我们不能简单地更改此类 lambda,因为这可能会破坏代码。存在采用可调用类型的模板参数并执行

decltype(&F::operator())
的代码,期望结果类型是指向成员类型的指针(这是现在唯一可以做的事情)。如果我们将无捕获 lambda 更改为隐式具有静态调用运算符,则所有此类代码都会因无捕获 lambda 而中断。此外,这将是语言 ABI 中断。虽然 lambda 无论如何都不应该出现在您的 ABI 中,但我们不能自信地说这样的代码不存在,也不应该破坏这样的代码。

© www.soinside.com 2019 - 2024. All rights reserved.