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
Barbara StreisandOriginal
2024-12-11 13:46:111042Durchsuche

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);

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;
};

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);

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!

Stellungnahme:
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