Heim > Backend-Entwicklung > C++ > Hauptteil

Wie kann ich einen eindeutigen Zeiger in einem C-Lambda-Ausdruck sicher erfassen?

Linda Hamilton
Freigeben: 2024-11-22 10:54:11
Original
198 Leute haben es durchsucht

How Can I Safely Capture a Unique Pointer in a C   Lambda Expression?

Erfassen eines eindeutigen Ptr in einen Lambda-Ausdruck in C

In C kann das Erfassen des Besitzes beim Umgang mit eindeutigen Zeigern und Lambdas eine Herausforderung sein . Ein häufiger Versuch besteht darin, einen std::unique_ptr als Referenz zu übergeben und ihn in einem Lambda zu erfassen:

std::function<void()> getAction(std::unique_ptr<MyClass>& psomething);

return [psomething]() { psomething->do_some_thing(); };
Nach dem Login kopieren

Dieser Ansatz kann jedoch aufgrund von Lebensdauerproblemen nicht kompiliert werden. Um dieses Problem zu lösen, führte C 14 die generalisierte Lambda-Erfassung ein, die die explizite Angabe der Eigentumsübertragung ermöglicht:

std::function<void()> getAction(std::unique_ptr<MyClass> psomething) {
    return [auto psomething = move(psomething)]() { psomething->do_some_thing(); };
}
Nach dem Login kopieren

Durch die Verwendung von auto psomething = move(psomething) wird das Eigentum am eindeutigen Zeiger auf das Lambda übertragen, wodurch entfällt lebenslange Bedenken.

Wenn Sie jedoch benutzerdefinierte Verschiebungs- und Kopierimplementierungen haben, wie unten gezeigt:

template<typename T>
T copy(const T &amp;t) {
    return t;
}

template<typename T>
T move(T &amp;t) {
    return std::move(t);
}
Nach dem Login kopieren

Sie sollten vorsichtig sein wenn Sie move für L-Wert-Referenzen verwenden, da dies zu undefiniertem Verhalten führen kann. Beispielsweise sollte das Verschieben eines temporären Objekts mit move(A()) vermieden werden. Stattdessen wird empfohlen, separate Verschiebungs- und Kopierversionen für L-Wert- und R-Wert-Referenzen bereitzustellen.

Daher bietet die generalisierte Lambda-Erfassung beim Erfassen eines eindeutigen Zeigers in einen Lambda-Ausdruck eine bequeme und explizite Möglichkeit, die Eigentumsübertragung abzuwickeln und sicherzustellen richtiges Lebensmanagement.

Das obige ist der detaillierte Inhalt vonWie kann ich einen eindeutigen Zeiger in einem C-Lambda-Ausdruck sicher 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