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

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

Linda Hamilton
Freigeben: 2024-12-18 13:25:24
Original
866 Leute haben es durchsucht

Why Can't I Create an `std::function` from a Move-Capturing Lambda with a Non-Copyable Object?

Erstellen einer std::function aus einem Move-Capturing-Lambda-Ausdruck: Aufdecken der Einschränkungen

Im Bereich C besteht die Aufgabe darin, eine std::function zu konstruieren Aus einem bewegungserfassenden Lambda-Ausdruck entsteht häufig. Während Lambda-Ausdrücke zur Bewegungserfassung selbst nahtlos erstellt werden können, liegt das Rätsel in der Unfähigkeit, sie in einer std::function zu kapseln.

Wie unser Beispiel zeigt:

auto pi = std::make_unique<int>(0);
auto foo = [q = std::move(pi)] {
    *q = 5;
    std::cout << *q << std::endl;
};
Nach dem Login kopieren

Dieses Beispiel Konstruiert mühelos einen bewegungserfassenden Lambda-Ausdruck, ohne auf Hindernisse zu stoßen. Wenn wir jedoch versuchen, dieses Lambda in eine std::function zu integrieren, stoßen wir auf eine Flut von Fehlern:

std::function<void()> bar = foo;
std::function<void()> bar{foo};
std::function<void()> bar{std::move(foo)};
std::function<void()> bar = std::move(foo);
std::function<void()> bar{std::forward<std::function<void()>>(foo)};
std::function<void()> bar = std::forward<std::function<void()>>(foo);
Nach dem Login kopieren

Wenn wir uns mit den Feinheiten der std::function-Klasse befassen, entdecken wir den folgenden Konstruktor:

template<class F> function(F f);
Nach dem Login kopieren

Dieser Konstruktor enthüllt das zugrunde liegende Problem: Er erfordert, dass die gekapselte Funktion F kopierkonstruierbar ist. Unser Lambda-Ausdruck zur Bewegungserfassung erfüllt dieses Kriterium jedoch nicht. Stattdessen wird ein nicht kopierkonstruierbares Objekt verschoben.

Daher kommen wir zu dem Schluss, dass die Konstruktion einer std::function aus einem Lambda-Ausdruck zur Bewegungserfassung zwar machbar ist, beim Lambda jedoch vor einer unüberwindbaren Hürde steht move-erfasst ein nicht kopierkonstruierbares Objekt. In solchen Szenarien werden alternative Ansätze wie das „Release/Acquire-in-Lambda“-Idiom notwendig.

Das obige ist der detaillierte Inhalt vonWarum kann ich keine „std::function' aus einem Move-Capturing-Lambda mit einem nicht kopierbaren Objekt erstellen?. 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