Heim >Backend-Entwicklung >C++ >Warum kann ich keine „std::function' aus einem Move-Capturing-Lambda erstellen?
Erstellen einer std::function aus einem Move-Capturing-Lambda-Ausdruck
Es ist von entscheidender Bedeutung, die Problematik der Erstellung von std::function-Objekten aus Lambda-Ausdrücken zu verstehen . Es ist möglich, Lambda-Ausdrücke mit Move Capture zu erstellen, aber beim Versuch, sie in std::function zu kapseln, können Fehler auftreten.
Fehlerbeispiele
Mehrere Versuche dazu Die Konvertierung eines bewegungserfassenden Lambda in std::function führte durchweg zum Fehler „Aufruf des implizit gelöschten Kopierkonstruktors von ' Die Notwendigkeit von Move-Capturing-Lambdas Move-Capturing in Lambda-Ausdrücken wird in Szenarien notwendig, in denen der Besitz eines Objekts geteilt wird nicht realisierbar, z. B. in benutzerdefinierten UI-Bibliotheken. Diese Bibliotheken bieten Methoden wie on_mouse_down() und push_undo_action() zum Registrieren von Event-Handlern mit std::function. Um einen effizienten Ressourcenbesitz zu gewährleisten, wird die Bewegungserfassung in Lambda-Ausdrücken der früheren, umständlichen „Release/Acquire-in-Lambda“-Sprache vorgezogen. Einschränkungen bei der std::function-Konstruktion Der std::function-Konstruktor zum direkten Angeben eines Funktionsobjekts hat Folgendes Signatur: Diese Garantien umfassen Folgendes: Anwendbarkeit auf Move-Capture Während Lambda-Ausdrücke mit Move Capture verstoßen nicht gegen die Kopierbarkeitsanforderung von F, sie bieten häufig Move-Capture-Typen (z. B. std::unique_ptr), die dies nicht bieten der erforderliche Kopierkonstruktor. Infolgedessen wird die Konstruktion von std::function aus diesen bewegungserfassenden Lambdas unmöglich. Fazit Es ist wichtig zu beachten, dass die Konvertierung von Bewegungs- Das Erfassen von Lambdas in std::function ist aufgrund der Einschränkungen des std::function-Konstruktors bei der Verarbeitung von Nur-Verschiebungs-Typen nicht möglich. Diese Einschränkung ergibt sich aus der Notwendigkeit von std::function, eine Kopie des gekapselten Funktionsobjekts zu verwalten. Das obige ist der detaillierte Inhalt vonWarum kann ich keine „std::function' aus einem Move-Capturing-Lambda erstellen?. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!template <class F> function(F f);</p>
<p>Ein anderer verwandter Konstruktor akzeptiert jedoch einen Allokator und einen Verweis auf einen Typ, der bestimmte Garantien bietet:</p>
<pre class="brush:php;toolbar:false">template <class F, class A> function(allocator_arg_t, const A& a, F f);