2016-12-02 2 views
4
int i = 9; 
struct_variable.f = [i](T struct_variable&) { 
    do_something_with_capture_variable(i); 
    ... 
    struct_variable.f = another_compatible_std_function; 
    //do something else, but never use captured variable after here 
    ... 
}; 

struct_variable.f(struct_variable); 

Функция лямбды сохраняются в качестве члена struct_variable.f (который также напечатало std::function), так и в обратном вызове struct_variable.f заменяется another_compatible_std_function после финиша, используя захваченный переменным.Присвоить новое значение STD :: функции при вызове

Безопасна ли эта практика?

+0

Я хочу сказать «да», пока вы будете осторожны, потому что ситуация аналогична «удалению» объекта во время выполнения одной из его функций-членов. Но это сложно доказать со Стандарта. – aschepler

ответ

0

Часть кода лямбда скомпилирована в машинный код, и при назначении назначается только указатель на функцию, указывающий на то, что этот код назначен. Поэтому, пока вы больше не используете захваченные переменные, должно быть безопасно повторно назначить переменную, содержащую лямбда, потому что не будет изменен текущий код.