Heim > Backend-Entwicklung > C++ > Wie kann ich Move Capture in C Lambdas erreichen, insbesondere in C 11?

Wie kann ich Move Capture in C Lambdas erreichen, insbesondere in C 11?

Susan Sarandon
Freigeben: 2024-12-10 14:51:10
Original
522 Leute haben es durchsucht

How Can I Achieve Move Capture in C   Lambdas, Especially in C  11?

Move Capture in C-Lambdas verstehen

In C 11 erfolgt die Erfassung von Variablen in Lambdas im Allgemeinen durch Referenz. Diese Referenz bleibt aktiv, solange das Lambda vorhanden ist, was manchmal zu unbeabsichtigtem Verhalten führen kann, wenn die erfasste Variable verschoben wird.

A C 14-Lösung: Generalisierte Lambda-Erfassung

In C 14 generalisiert Die Lambda-Erfassung wurde eingeführt und ermöglicht die Bewegungserfassung. Dies ermöglicht eine bequeme Manipulation von reinen Bewegungstypen, wie z. B. eindeutigen Zeigern.

std::make_unique<int>()
    .then([u = std::move(u)] { do_something_with(u); });
Nach dem Login kopieren

Problemumgehungen für C 11

Vor C 14 kann die Bewegungserfassung mithilfe von Hilfsfunktionen emuliert werden:

Methode 1: make_rref

Dieser Ansatz erstellt eine Wrapper-Klasse, rref_impl, das den Wert kapselt und seine Lebensdauer verwaltet.

template <typename T> using rref_impl = ...;
auto rref = make_rref(std::move(val));

[rref]() mutable { std::move(rref.get()); };
Nach dem Login kopieren

Das Erfassen von rref in einem Lambda ermöglicht jedoch das Kopieren, was möglicherweise zu Laufzeitfehlern führt.

Methode 2: Capture( ) Funktion

Diese Methode verwendet eine Funktion, die den erfassten Wert als Referenz nimmt und ein Lambda zurückgibt, das die Funktion mit aufruft erfasster Wert als Argument.

template <typename T, typename F> using capture_impl = ...;
auto lambda = capture(std::move(val), [](auto&& v) { return std::forward<decltype(v)>(v); });
Nach dem Login kopieren

Dies verhindert das Kopieren des Lambda und stellt sicher, dass der erfasste Wert in den Gültigkeitsbereich des Lambda verschoben wird.

Beachten Sie, dass diese Problemumgehungen nicht so elegant sind wie die verallgemeinerten Lambda-Capture in C 14, aber sie bieten eine Möglichkeit, die Move-Capture in früheren Versionen der Sprache zu emulieren.

Das obige ist der detaillierte Inhalt vonWie kann ich Move Capture in C Lambdas erreichen, insbesondere in C 11?. 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