Eindeutige Zeiger in Lambda-Ausdrücken erfassen
Beim Versuch, eindeutige Zeiger in Lambda-Ausdrücken zu erfassen, treten häufig Schwierigkeiten auf. Stellen Sie sich das folgende Szenario vor:
std::function<void()> getAction(std::unique_ptr<MyClass> &&psomething) { // Caller gives ownership of psomething return [psomething]() { psomething->do_some_thing(); // psomething is expected to be released after this point }; }
Der obige Code kann nicht kompiliert werden, da das Lambda den eindeutigen Zeiger nicht als Referenz erfassen kann. Um dieses Problem zu lösen, führte C 14 die generalisierte Lambda-Erfassung ein.
Lambda Generalized Capture in C 14
Die generalisierte Lambda-Erfassung ermöglicht die Erfassung von Variablen nach Wert oder Verschiebung. Dies wird durch die Verwendung der = move()-Syntax beim Erfassen des eindeutigen Zeigers erreicht, wie unten gezeigt:
std::function<void()> getAction(std::unique_ptr<MyClass> psomething) { // Caller gives ownership of psomething return [auto psomething = std::move(psomething)]() { psomething->do_some_thing(); // psomething is expected to be released after this point }; }
Durch die Verwendung von „auto“ leitet das Lambda automatisch den Typ von psomething ab, bei dem es sich um einen eindeutigen Zeiger handelt. Der Ausdruck = std::move(psomething) verschiebt explizit den Besitz des eindeutigen Zeigers in den Lambda-Ausdruck.
Implementierung von Verschieben und Kopieren
Die Implementierung der Kopie Die in der Frage bereitgestellten Funktionen zum Verschieben und Verschieben gelten für zweiphasiges Kopieren/Verschieben (wie in [diesem StackOverflow Frage](https://stackoverflow.com/questions/6322951/whats-the-difference-between-a-copy-constructor-and-a-move-constructor)).
Es ist jedoch wichtig Es ist zu beachten, dass C 11 durch den std::move-Ausdruck eine andere Bedeutung für die Move-Funktion eingeführt hat. Der std::move-Ausdruck qualifiziert das Objekt, auf das er angewendet wird, als R-Wert und gibt im Wesentlichen an, dass es verschoben werden soll. Daher ist es im Kontext der generalisierten Lambda-Erfassung nicht notwendig, std::move explizit für den eindeutigen Zeiger aufzurufen; Das Lambda verschiebt den Besitz automatisch nach Bedarf.
Das obige ist der detaillierte Inhalt vonWie kann ich eindeutige Zeiger in C-Lambda-Ausdrücken korrekt erfassen?. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!