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

Kann ich eine „std::function' aus einem Move-Capturing-Lambda-Ausdruck erstellen?

Barbara Streisand
Freigeben: 2024-12-11 13:46:11
Original
1011 Leute haben es durchsucht

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

Erstellen einer std::function aus einem bewegungserfassenden Lambda-Ausdruck

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

Anforderungen

Damit dieser Konstruktor funktioniert, gilt Folgendes Anforderungen müssen erfüllt sein:

  • Die Erfassung des Lambda-Ausdrucks muss kopierkonstruierbar sein.
  • Der Lambda-Ausdruck muss mit den angegebenen Argumenttypen und dem Rückgabetyp aufrufbar sein.
  • Der Kopierkonstruktor und Destruktor des Lambda-Captures darf nicht ausgelöst werden Ausnahmen.

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

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

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!

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