Erstellen einer std::function aus einem Move-Capturing Lambda
Erstellen einer std::function aus einem Move-Only-Typ, z Als Lambda zur Bewegungserfassung kann es aufgrund der Einschränkung des Bewegungskonstruktors zu Fehlern kommen. Diese Einschränkung ergibt sich aus der Art und Weise, wie std::function definiert und konstruiert wird.
Den std::function-Konstruktor verstehen
Der std::function-Konstruktor kann aufgerufen werden zwei Möglichkeiten:
In beiden Fällen muss das Lambda (F) CopyConstructible sein. Dies bedeutet, dass Sie das Lambda nicht direkt in die std::function verschieben können.
Außerdem wird „operator =“ in Bezug auf den Konstruktor und den Swap definiert, was bedeutet, dass dieselben Einschränkungen gelten.
Konsequenzen für Nur-Verschieben-Typen
Daher ist es nicht möglich, eine std::function aus a zu konstruieren bewegungserfassendes Lambda, das einen Nur-Bewegungstyp erfasst. Der Versuch, dies zu tun, führt aufgrund des implizit gelöschten Kopierkonstruktors zu einem Fehler bei der Kompilierung.
Alternative Lösung
Um dieses Problem zu umgehen, können Sie Folgendes verwenden: einen shared_ptr, um den Nur-Verschiebung-Typ einzuschließen und dann den shared_ptr in Ihrem Lambda zu erfassen. Der shared_ptr stellt sicher, dass der Typ kopierbar ist, sodass Sie eine std::function aus dem Lambda erstellen können.
Das obige ist der detaillierte Inhalt vonWie kann ich eine „std::function' aus einem Move-Capturing-Lambda erstellen?. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!