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

zazmityj  于 2023-05-20  发布在  其他
关注(0)|答案(1)|浏览(220)

下面两个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;
}

GCC警告&exit_code

warning: capture of variable 'exit_code' with non-automatic storage duration

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

error: 'exit_code' cannot be captured because it does not have automatic storage duration

如果上面的代码是不正确的(例如 * 格式不正确 *),那么使lambda可以访问全局变量的正确方法是什么?lambda_2法律的吗?如果不是,那么为什么GCC不警告lambda_2中全局变量的使用?它是如何访问它甚至没有捕获它?
如果没有一个是正确的,那么上面的代码应该如何设计?

vfh0ocws

vfh0ocws1#

你不需要捕获非局部变量。lambda
lambda表达式可以使用一个变量而不捕获它,如果变量

*为非局部变量或具有静态或线程本地存储持续时间(在这种情况下无法捕获变量),或

由于exit_code是一个全局变量,它可以在lambda的主体中使用,而无需捕获它。
参见Why lambda captures only automatic storage variables?

相关问题