我使用的是 Visual Studio 2010,它显然在 lambda 上有一些错误行为,并且有这个嵌套 lambda,其中内部 lambda 返回包装为 std::function 的第二个 lambda(参见MSDN 上的“高阶 Lambda 函数” http://msdn.microsoft.com/en-us/library/dd293599.aspx#higherOrderLambdaExpressions):
int x = 0;
auto lambda = [&]( int n )
{
return std::function<void()>(
[&] // Note capture
{
x = n;
}
);
};
lambda( -10 )(); // Call outer and inner lambdas
assert( -10 == x ); // Fails!
这可以编译,但在断言处失败。具体来说,内部 lambda 中的 n 未初始化(0xCCCCCCCC),但 x 已成功修改为其值。如果我将内部 lambda 的捕获子句更改为“[&,n]”,则断言将按预期通过。这是 VS2010 的错误还是我不明白 lambda 捕获是如何工作的?
这不是一个错误,因为n
在 lambda return 语句之后超出范围,因此通过引用捕获在您使用它时会失效。
int x = 0;
auto lambda = [&]( int n )
{
return std::function<void()>( // n is local to "lambda" and is destroyed after return statement, thus when you call the std::function, the reference capture of n is invalid.
[&]
{
x = n; // Undefined behaviour
}
);
};
auto tmp = lambda(-10);
// n is no longer valid
tmp(); // calling tmp which uses reference of n which is alrdy destroyed.
assert( -10 == x ); // Fails!
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)