visual studio 2010-C++在VS2010中使用lambda参数捕获嵌套lambda错误
visual studio 2010 - C++ nested lambda bug in VS2010 with lambda parameter capture?
我使用的是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
}
相关文章:
- lambda参数转换为constexpr技巧,然后获取带链接的数组
- 使用自动推导的 lambda 参数作为常量表达式
- 如何参数化用作另一个 lambda 参数的 lambda
- 有没有办法根据 lambda 参数返回类型部分专用化我的模板化函数?
- 从成员函数签名中自动推导lambda参数
- Clang声称通用lambda参数的constexpr成员不是constexpr
- 如果我的模板类型首先以lambda参数而发生,则MSVC会引起一个奇怪的错误
- 继承类中没有匹配的泛型委托作为 lambda 参数
- 为什么在lambda参数中不允许自动
- 如何定义通用 lambda 参数的模板参数?
- 在 QGraphicsScene 中拖动 QPixmap:如何避免 lambda 参数中不允许'auto'
- variadic模板函数会以相反的顺序调用lambda参数
- 可变模板lambda参数的模板推导
- 嵌套模板功能中的C 0x lambda参数
- 带有 std::函数和 lambda 参数的分段错误
- 从值捕获的变量分配到lambda参数时,GCC编译器分割故障
- 标准::p空气的通用 lambda 参数
- C++ lambda 参数列表
- 我的 lambda 参数真的在阴影我的当地人吗?
- 从常量和引用的角度来看,函数应该如何接受*lambda*参数