Heim > Backend-Entwicklung > C++ > Wie kann ich eindeutige Zeiger in C-Lambda-Ausdrücken korrekt erfassen?

Wie kann ich eindeutige Zeiger in C-Lambda-Ausdrücken korrekt erfassen?

Patricia Arquette
Freigeben: 2024-11-21 05:23:10
Original
606 Leute haben es durchsucht

How Can I Correctly Capture Unique Pointers in C   Lambda Expressions?

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
    };
}
Nach dem Login kopieren

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
    };
}
Nach dem Login kopieren

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!

Quelle:php.cn
Erklärung dieser Website
Der Inhalt dieses Artikels wird freiwillig von Internetnutzern beigesteuert und das Urheberrecht liegt beim ursprünglichen Autor. Diese Website übernimmt keine entsprechende rechtliche Verantwortung. Wenn Sie Inhalte finden, bei denen der Verdacht eines Plagiats oder einer Rechtsverletzung besteht, wenden Sie sich bitte an admin@php.cn
Neueste Artikel des Autors
Beliebte Tutorials
Mehr>
Neueste Downloads
Mehr>
Web-Effekte
Quellcode der Website
Website-Materialien
Frontend-Vorlage