In C 11 erfolgt die Erfassung von Variablen in Lambdas im Allgemeinen durch Referenz. Diese Referenz bleibt aktiv, solange das Lambda vorhanden ist, was manchmal zu unbeabsichtigtem Verhalten führen kann, wenn die erfasste Variable verschoben wird.
In C 14 generalisiert Die Lambda-Erfassung wurde eingeführt und ermöglicht die Bewegungserfassung. Dies ermöglicht eine bequeme Manipulation von reinen Bewegungstypen, wie z. B. eindeutigen Zeigern.
std::make_unique<int>() .then([u = std::move(u)] { do_something_with(u); });
Vor C 14 kann die Bewegungserfassung mithilfe von Hilfsfunktionen emuliert werden:
Dieser Ansatz erstellt eine Wrapper-Klasse, rref_impl, das den Wert kapselt und seine Lebensdauer verwaltet.
template <typename T> using rref_impl = ...; auto rref = make_rref(std::move(val)); [rref]() mutable { std::move(rref.get()); };
Das Erfassen von rref in einem Lambda ermöglicht jedoch das Kopieren, was möglicherweise zu Laufzeitfehlern führt.
Diese Methode verwendet eine Funktion, die den erfassten Wert als Referenz nimmt und ein Lambda zurückgibt, das die Funktion mit aufruft erfasster Wert als Argument.
template <typename T, typename F> using capture_impl = ...; auto lambda = capture(std::move(val), [](auto&& v) { return std::forward<decltype(v)>(v); });
Dies verhindert das Kopieren des Lambda und stellt sicher, dass der erfasste Wert in den Gültigkeitsbereich des Lambda verschoben wird.
Beachten Sie, dass diese Problemumgehungen nicht so elegant sind wie die verallgemeinerten Lambda-Capture in C 14, aber sie bieten eine Möglichkeit, die Move-Capture in früheren Versionen der Sprache zu emulieren.
Das obige ist der detaillierte Inhalt vonWie kann ich Move Capture in C Lambdas erreichen, insbesondere in C 11?. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!