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 Nur-Verschiebungs-Typen, wie z. B. eindeutigen Zeigern.
std::make_unique() .then([u = std::move(u)] { do_something_with(u); });
Vor C 14 kann die Bewegungserfassung mit emuliert werden Hilfsfunktionen:
Dieser Ansatz erstellt eine Wrapper-Klasse, rref_impl, das den Wert kapselt und seine Lebensdauer verwaltet.
templateusing 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 a Funktion, die den erfassten Wert als Referenz verwendet und ein Lambda zurückgibt, das die Funktion mit dem erfassten Wert als Argument aufruft.
templateusing capture_impl = ...; auto lambda = capture(std::move(val), [](auto&& v) { return std::forward (v); });
Dies verhindert das Kopieren des Lambda und stellt sicher, dass der erfasste Wert in den Lambda-Bereich verschoben wird.
Denken Sie daran, dass diese Problemumgehungen nicht so elegant sind wie die verallgemeinerte Lambda-Erfassung in C 14, aber sie bieten eine Möglichkeit um die Bewegungserfassung in früheren Versionen der Sprache zu emulieren.
Haftungsausschluss: Alle bereitgestellten Ressourcen stammen teilweise aus dem Internet. Wenn eine Verletzung Ihres Urheberrechts oder anderer Rechte und Interessen vorliegt, erläutern Sie bitte die detaillierten Gründe und legen Sie einen Nachweis des Urheberrechts oder Ihrer Rechte und Interessen vor und senden Sie ihn dann an die E-Mail-Adresse: [email protected] Wir werden die Angelegenheit so schnell wie möglich für Sie erledigen.
Copyright© 2022 湘ICP备2022001581号-3