2015-11-18 3 views
1

Я видел источник лямбда C++.C++ lambda error

#include <functional> 
#include <iostream> 

int main() 
{ 
    std::function<int(int)> factorial; 

// factorial = [factorial](int n)->int // runtime error 
    factorial = [&factorial](int n)->int // right 
    { 
     if (n == 1) { 
      return 1; 
     } 
     else { 
      return n * factorial(n - 1); 
     } 
    }; 

    std::cout << factorial(5) << "\n"; 
} 

Я не понимаю, почему возникает ошибка времени выполнения.
Спасибо за ваше отношение!

ответ

5
factorial = [factorial](int n)->int 

Эта версия фиксирует factorial по значению. В точке выражения лямбда factorial пуст, поэтому вы получаете копию пустого std::function, и вы получите std::bad_function_call, если попытаетесь его вызвать. factorial = /*...*/; назначает исходный объект, который отделен от копии, созданной для закрытия.

factorial = [&factorial](int n)->int 

Эта версия захватывает factorial в качестве ссылки, т.е. factorial внутри имен лямбды и тот же объект, как factorial снаружи. Таким образом, назначение factorial = /*...*/; влияет на переменную factorial внутри лямбда, поэтому вы вызываете действительную функцию.

+0

Благодарим за помощь. Я хотел бы ответить, как вы. –