Heim >Backend-Entwicklung >C++ >Wie kann ich einen eindeutigen Zeiger in einem C-Lambda-Ausdruck sicher erfassen?

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

Linda Hamilton
Linda HamiltonOriginal
2024-11-22 10:54:11309Durchsuche

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(); };

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 &amp;t) {
    return t;
}

template<typename T>
T move(T &amp;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!

Stellungnahme:
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