Heim > Backend-Entwicklung > C++ > Wie kann ich eine „std::function' aus einem Move-Capturing-Lambda erstellen?

Wie kann ich eine „std::function' aus einem Move-Capturing-Lambda erstellen?

DDD
Freigeben: 2024-12-24 10:12:37
Original
436 Leute haben es durchsucht

How Can I Create an `std::function` from a Move-Capturing Lambda?

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:

  1. std::function(F f);
  2. std::function(allocator_arg_t, const A& a, F f);

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!

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
Beliebte Tutorials
Mehr>
Neueste Downloads
Mehr>
Web-Effekte
Quellcode der Website
Website-Materialien
Frontend-Vorlage