visual studio 2010-C++在VS2010中使用lambda参数捕获嵌套lambda错误

visual studio 2010 - C++ nested lambda bug in VS2010 with lambda parameter capture?

本文关键字:lambda 参数 错误 嵌套 2010-C++ studio VS2010 visual      更新时间:2023-10-16

我使用的是Visual Studio 2010,它显然在lambda上有一些错误行为,并且有这个嵌套的lambda,其中内部lambda返回第二个lambda,该lambda包装为std::函数(参见MSDN上的"Higher order lambda Functions"):

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未初始化(0xCCCCCC),但x已成功修改为其值。如果我将内部lambda的capture子句更改为"[&,n]",则断言将按预期传递。这是VS2010的一个错误,还是我不了解lambda捕获的工作原理?

这不是一个错误,因为n在lambdas返回语句后超出了范围,因此通过引用捕获在您使用它时无效。

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!

这类似于只返回一个简单引用的情况。让你措手不及的是编译器没有发出警告。所以这不是编译器中的错误,只是缺少警告。

std::function<int()> F(int n)
{
    return [&]{ return n; };  //no warning
}
int& F2(int n)
{
    return n; //warning
}