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
Susan SarandonOriginal
2024-12-10 14:51:10613Durchsuche

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

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

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

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!

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