Bedenken Sie:Was passiert, wenn ein Lambda während des Laufs bewegt/zerstört wird?
std::vector<std::function<void()>> vec;
something_unmovable m;
vec.push_back([&vec, m]() {
vec.resize(100);
// things with 'm'
});
vec[0]();
vec.resize(100)
wahrscheinlich eine Neuzuweisung des Vektors verursacht, was bedeutet, dass die std::function
s an einen neuen Speicherort kopiert werden, und die alten zerstört. Dies geschieht jedoch, während der alte noch läuft. Dieser spezielle Code läuft, weil das Lambda nichts tut, aber ich kann mir vorstellen, dass dies leicht zu undefiniertem Verhalten führen kann.
Also, was genau passiert? Ist m
noch aus dem Vektor zugänglich? Oder ist der this
Zeiger des Lambdas jetzt ungültig (zeigt auf freigegebenen Speicher), so dass nichts, was die Lambda-Captures erreichen können, zugänglich ist, doch wenn es Code ausführt, der nichts verwendet, erfasst es kein undefiniertes Verhalten?
Ist auch der Fall, wo das Lambda ist anders beweglich?
Bedeutet "unbeweglich" "nicht kopierbar" oder "m" kopierbar? (Im allgemeinen Sprachgebrauch, wenn etwas kopierbar ist, ist es automatisch bewegbar, da eine Kopie eine gültige Implementierung eines Zuges ist.) Sie können kein Lambda erstellen, das einen nicht kopierbaren Wert erfasst ([demo] (https://ideone.com/ MMW5sW)). –
Ich nahm "unbeweglich", um nur einen gelöschten Move-Konstruktor mit anderen Standard zu meinen. Unter diesen Annahmen kann man eins machen. Ich denke, der Punkt der Frage war, was passiert mit dem Inhalt eines Lambda Capture, wenn das Capture selbst zerstört wird. AFAIK erhalten sie die gleiche Behandlung wie Strukturen. – defube