C++23 permite definir um lambda como static
. ou seja, se um lambda não captura nada, então ele pode ser definido como 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; };
Eu só me pergunto:
Por que o padrão C++ não define implicitamente um lambda que não captura nada como
static
padrão?
Quando lambdas foram introduzidas, ninguém levou em consideração o fato de que lambdas não capturadoras não precisavam passar o
this
ponteiro do objeto lambda como um argumento paraoperator()
. Quando eles perceberam isso em C++23, era tarde demais para mudar o comportamento padrão que existia desde C++11. A razão pela qual eles não conseguiram mudar o comportamento é descrita em P1169R3Embora eles tenham considerado tornar essa implementação de comportamento definida permitindo que um usuário alterne esse comportamento com uma opção do compilador, isso foi rejeitado porque seria uma mudança de comportamento observável que geralmente não é uma boa opção para escolhas definidas pela implementação.