Beim Versuch, eine std::function aus einem Move-Capturing-Lambda-Ausdruck zu erstellen, können Schwierigkeiten auftreten , obwohl es keine Probleme beim Erstellen des Lambda selbst gab. Dies liegt an den Einschränkungen, die durch den Konstruktor std::function und seinen Zuweisungsoperator auferlegt werden.
Der Konstruktor std::function und der Operator= erfordern, dass das Argument CopyConstructible ist. Ein Move-Capturing-Lambda, das einen Nur-Move-Typ (z. B. std::unique_ptr) erfasst, kann jedoch nicht CopyConstructible sein.
Zur Klarstellung: Move-Capturing bezieht sich auf den Erfassungsmechanismus, der von Lambda-Ausdrücken verwendet wird. Im Gegensatz zum Copy-Capturing, das eine Kopie der erfassten Variablen erstellt, überträgt das Move-Capturing den Besitz der Variablen auf das Lambda.
Der von Ihnen bereitgestellte Code veranschaulicht das Problem:
auto pi = std::make_unique<int>(0); auto foo = [q = std::move(pi)] { *q = 5; std::cout << *q << std::endl; }; std::function<void()> bar = foo; // Error: attempts to copy-construct 'foo'
Der Lambda-Ausdruck „foo“ erfasst den eindeutigen Zeiger „pi“ durch Verschieben und macht ihn zu einem Nur-Verschieben-Typ. Daher ist das Erstellen einer std::function aus „foo“ nicht möglich, da „foo“ nicht kopiert werden kann.
Um diese Einschränkung zu umgehen, ziehen Sie alternative Ansätze in Betracht, z. B. die Verwendung von std::bind oder das Erstellen einer Wrapper-Klasse das das Lambda kapselt und eine CopyConstructible-Schnittstelle bereitstellt.
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!