Es ist möglich, eine std::function aus einem bewegungserfassenden Lambda-Ausdruck zu erstellen; Es gelten jedoch bestimmte Einschränkungen.
Vorlagenkonstruktor
Eine std::function kann aus einem bewegungserfassenden Lambda mithilfe des folgenden Vorlagenkonstruktors erstellt werden:
template<class F> function(F f);
Anforderungen
Damit dieser Konstruktor funktioniert, gilt Folgendes Anforderungen müssen erfüllt sein:
Nur-Verschiebungstypen
Es ist nicht möglich, eine std::function aus einem Lambda zu konstruieren, das sich verschiebt. erfasst einen Nur-Verschiebungstyp. Dies liegt daran, dass der Kopierkonstruktor und der Zuweisungsoperator von std::function in Bezug auf einen Konstruktor definiert sind, der kopierkonstruierbare Typen erfordert.
Beispiel
Bedenken Sie den folgenden Codeausschnitt :
auto pi = std::make_unique<int>(0); // Move-capturing lambda auto foo = [q = std::move(pi)] { *q = 5; std::cout << *q << std::endl; };
Versuch, aus diesem Lambda eine std::function mit einem der folgenden Ansätze zu erstellen führt zu einem Kompilierungsfehler:
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);
Dies liegt daran, dass pi ein Nur-Verschiebungstyp ist und der Kopierkonstruktor von std::function kopierkonstruierbare Typen erfordert.
Daher, wenn Sie Wenn Sie ein bewegungserfassendes Lambda mit std::function verwenden möchten, stellen Sie sicher, dass seine Erfassung kopierkonstruierbar ist.
Das obige ist der detaillierte Inhalt vonKann ich eine „std::function' aus einem Move-Capturing-Lambda-Ausdruck erstellen?. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!