„Wenn ein Arbeiter seine Arbeit gut machen will, muss er zuerst seine Werkzeuge schärfen.“ – Konfuzius, „Die Gespräche des Konfuzius. Lu Linggong“
Titelseite > Programmierung > 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?

Veröffentlicht am 23.12.2024
Durchsuche:127

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 Nur-Verschiebungs-Typen, wie z. B. eindeutigen Zeigern.

std::make_unique()
    .then([u = std::move(u)] { do_something_with(u); });

Problemumgehungen für C 11

Vor C 14 kann die Bewegungserfassung mit emuliert werden Hilfsfunktionen:

Methode 1: make_rref

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

template  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: Funktion „capture()“

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

template  using capture_impl = ...;
auto lambda = capture(std::move(val), [](auto&& v) { return std::forward(v); });

Dies verhindert das Kopieren des Lambda und stellt sicher, dass der erfasste Wert in den Lambda-Bereich verschoben wird.

Denken Sie daran, dass diese Problemumgehungen nicht so elegant sind wie die verallgemeinerte Lambda-Erfassung in C 14, aber sie bieten eine Möglichkeit um die Bewegungserfassung in früheren Versionen der Sprache zu emulieren.

Neuestes Tutorial Mehr>

Haftungsausschluss: Alle bereitgestellten Ressourcen stammen teilweise aus dem Internet. Wenn eine Verletzung Ihres Urheberrechts oder anderer Rechte und Interessen vorliegt, erläutern Sie bitte die detaillierten Gründe und legen Sie einen Nachweis des Urheberrechts oder Ihrer Rechte und Interessen vor und senden Sie ihn dann an die E-Mail-Adresse: [email protected] Wir werden die Angelegenheit so schnell wie möglich für Sie erledigen.

Copyright© 2022 湘ICP备2022001581号-3