Я использую Visual Studio 2010, которая, по-видимому, имеет некоторую ошибку в работе с лямбдами, и эта вложенная лямбда-выражение, где внутренняя лямбда возвращает вторую лямбду, упакованную как std :: function (см. «Лямбда-функции высшего порядка» в MSDN ):
int x = 0;
auto lambda = [&]( int n )
{
return std::function(
[&] // Note capture
{
x = n;
}
);
};
lambda( -10 )(); // Call outer and inner lambdas
assert( -10 == x ); // Fails!
Это компилируется, но не выполняет assert. В частности, n во внутренней лямбде не инициализирован (0xCCCCCCCC), но x успешно изменен на свое значение. Если я изменю предложение захвата внутренней лямбды на «[&, n]», утверждение будет выполнено должным образом. Это ошибка VS2010, или я не понял, как работает лямбда-захват?