2016-12-02 1 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); 

Die Lambda-Funktion als Mitglied gespeichert ruft struct_variable.f (was getippt auch std::function ist), und in der Callback, struct_variable.f von another_compatible_std_function nach dem Fertig mit erfassten Variable ersetzt wird.Assign neuer Wert std :: Funktion während

Ist diese Praxis garantiert sicher?

+0

Ich möchte ja sagen, solange Sie vorsichtig sind, da die Situation analog zum "Löschen" eines Objekts während der Ausführung einer seiner Mitgliedsfunktionen ist. Aber das ist aus dem Standard schwer zu beweisen. – aschepler

Antwort

0

Code-Teil des Lambda wird in Maschinencode kompiliert und während der Zuweisung wird nur Zeiger-zu-Funktion zugewiesen, die auf diesen Code zeigen. Solange Sie also keine erfassten Variablen mehr verwenden, sollte es sicher sein, die Variable mit dem Lambda neu zuzuordnen, da kein laufender Code geändert wird.