如何在 lambda 函数中访问全局变量?

dig*_*evo 0 c++ lambda global-variables gcc-warning

下面两个 lambda 函数哪一个是正确的?

#include <cstdlib>


extern constinit int exit_code { };

int main( )
{
    auto lambda_1 { [ &exit_code ]( ) noexcept
                    {
                        exit_code = EXIT_FAILURE;
                    } };

    auto lambda_2 { [ ]( ) noexcept
                    {
                        exit_code = EXIT_FAILURE;
                    } };

    lambda_1( );
    lambda_2( );

    return exit_code;
}
Run Code Online (Sandbox Code Playgroud)

海湾合作委员会警告&exit_code

#include <cstdlib>


extern constinit int exit_code { };

int main( )
{
    auto lambda_1 { [ &exit_code ]( ) noexcept
                    {
                        exit_code = EXIT_FAILURE;
                    } };

    auto lambda_2 { [ ]( ) noexcept
                    {
                        exit_code = EXIT_FAILURE;
                    } };

    lambda_1( );
    lambda_2( );

    return exit_code;
}
Run Code Online (Sandbox Code Playgroud)

Clang 显示了一个关于它的错误:

warning: capture of variable 'exit_code' with non-automatic storage duration
Run Code Online (Sandbox Code Playgroud)

如果上面的代码不正确(例如格式错误),那么使 lambda 可以访问全局变量的正确方法是什么?合法吗lambda_2?如果不是,那么为什么 GCC 不警告全局变量的使用呢lambda_2?它如何在不捕获它的情况下访问它?

如果都不正确,那么上面的代码应该如何设计呢?

小智 7

您不需要捕获非局部变量。从拉姆达

lambda 表达式可以使用变量而不捕获它,如果该变量

  • 是非局部变量或具有静态或线程局部存储持续时间(在这种情况下无法捕获该变量),或者

由于exit_code是一个全局变量,因此它可以与 lambda 的主体一起使用,而无需捕获它。

请参阅为什么 lambda 仅捕获自动存储变量?