C ++ вложенная лямбда-ошибка в VS2010 с захватом лямбда-параметра? - PullRequest
7 голосов
/ 02 июня 2011

Я использую 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 или я не понял, как работает лямбда-захват?

Ответы [ 2 ]

8 голосов
/ 02 июня 2011

Это не ошибка, так как n выходит из области видимости после оператора возврата лямбда-выражения, таким образом, захват по ссылке становится недействительным во время его использования.

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!
3 голосов
/ 02 июня 2011

Это похоже на случай простого возврата простой ссылки. То, что вас поймало, это то, что компилятор не выдал предупреждение. Так что это не ошибка в компиляторе, это просто отсутствие предупреждения.

std::function<int()> F(int n)
{
    return [&]{ return n; };  //no warning
}
int& F2(int n)
{
    return n; //warning
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...