Heim > Backend-Entwicklung > C++ > Warum kann ich keine std::function aus einem Move-Capturing-Lambda erstellen?

Warum kann ich keine std::function aus einem Move-Capturing-Lambda erstellen?

Susan Sarandon
Freigeben: 2024-12-13 10:10:11
Original
109 Leute haben es durchsucht

Why Can't I Create an std::function from a Move-Capturing Lambda?

Konstruieren einer std::function aus einem Move-Capturing-Lambda

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'
Nach dem Login kopieren

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!

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