代码之家  ›  专栏  ›  技术社区  ›  xmllmx

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

  •  1
  • xmllmx  · 技术社区  · 1 年前

    C++23 允许将lambda定义为 static 也就是说,如果一个lambda没有捕获到任何东西,那么它可以被定义为 静止的 :

    // 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作为 静止的 默认情况下?

    1 回复  |  直到 1 年前
        1
  •  6
  •   3CxEZiVlQ    1 年前

    当引入lambdas时,没有人考虑到非捕获lambdas不需要传递lambda对象 this 指针作为参数指向 operator() 当他们在C++23中遇到这个问题时,改变C++11的默认行为已经太晚了。他们无法改变行为的原因在 P1169R3

    然而,我们不能简单地更改这样的lambdas,因为这可能会破坏代码。存在接受可调用类型的模板参数并执行以下操作的代码 decltype(&F::operator()) ,期望结果类型是指向成员类型的指针(这是目前唯一可能的)。如果我们将无捕获lambda隐式地更改为具有静态调用运算符,则所有此类代码都会因无捕获lambda而中断。此外,这将是语言ABI中断。虽然lambdas无论如何都不应该出现在你的ABI中,但我们不能自信地说这样的代码不存在,也不应该被破坏。

    尽管他们考虑了定义此行为实现并允许用户使用编译器选项切换此行为的情况。这是 rejected 因为这将是一个可观察到的行为变化,对于实现定义的选择来说,这通常不是一个好的选择。