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; };
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);
Wenn wir uns mit den Feinheiten der std::function-Klasse befassen, entdecken wir den folgenden Konstruktor:
template<class F> function(F f);
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!