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?它如何在不捕获它的情况下访问它?
如果都不正确,那么上面的代码应该如何设计呢?