下面两个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
中全局变量的使用?它是如何访问它甚至没有捕获它?
如果没有一个是正确的,那么上面的代码应该如何设计?
1条答案
按热度按时间vfh0ocws1#
你不需要捕获非局部变量。lambda:
lambda表达式可以使用一个变量而不捕获它,如果变量
*为非局部变量或具有静态或线程本地存储持续时间(在这种情况下无法捕获变量),或
由于
exit_code
是一个全局变量,它可以在lambda的主体中使用,而无需捕获它。参见Why lambda captures only automatic storage variables?