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(); };
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(); }; }
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 &t) { return t; } template<typename T> T move(T &t) { return std::move(t); }
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!