Я использую Visual Studio 2010, которая, по-видимому, имеет некоторые ошибки в лямбдах и имеет эту вложенную лямбду, где внутренняя лямбда возвращает вторую лямбду, заключенную в std :: function (ср. " заказать лямбда-функции "на MSDN ):
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!
Это компилируется, но терпит неудачу при утверждении. В частности, n во внутренней лямбде неинициализирован (0xCCCCCCCC), но x успешно изменен на свое значение. Если я изменю предложение захвата внутренней лямбды на «[&, n]», утверждение пройдет, как и ожидалось. Это ошибка с VS2010 или я не понял, как работает лямбда-захват?