Heim >Backend-Entwicklung >C++ >Warum kann ich keine „std::function' aus einem Move-Capturing-Lambda erstellen?

Warum kann ich keine „std::function' aus einem Move-Capturing-Lambda erstellen?

Susan Sarandon
Susan SarandonOriginal
2024-12-17 01:22:25277Durchsuche

Why Can't I Create a `std::function` from a Move-Capturing Lambda?

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:

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

Diese Garantien umfassen Folgendes:

  • F muss kopierkonstruierbar sein
  • f muss mit den bereitgestellten Argumenttypen (ArgTypes) aufrufbar sein und zurückgeben Typ (R)
  • Der Kopierkonstruktor und Destruktor von A darf keine Ausnahmen auslösen

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!

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