Heim > Backend-Entwicklung > C++ > Hauptteil

Wie erfasst man Variablen in Lambda-Funktionen explizit, um Kompilierungsfehler zu beheben?

Mary-Kate Olsen
Freigeben: 2024-10-23 18:23:01
Original
737 Leute haben es durchsucht

How to Explicitly Capture Variables in Lambda Functions to Resolve Compilation Errors?

Erfassen von Variablen in Lambda-Funktionen

Bei der Verwendung von Lambda-Ausdrücken in Funktionsaufrufen ist das Erfassen von Variablen aus dem umschließenden Bereich unerlässlich. In diesem Zusammenhang kann die Unfähigkeit, Variablen implizit zu erfassen, zu Kompilierungsfehlern führen, wie zum Beispiel dem berüchtigten „Fehler C3493: „Variable“ kann nicht implizit erfasst werden...“

Beachten Sie den folgenden Codeausschnitt:

<code class="cpp">int flagId = _ChildToRemove->getId();
auto new_end = std::remove_if(m_FinalFlagsVec.begin(), m_FinalFlagsVec.end(),
        [](Flag& device) { return device.getId() == flagId; });

m_FinalFlagsVec.erase(new_end, m_FinalFlagsVec.end());</code>
Nach dem Login kopieren

Dieser Code versucht, mithilfe einer Lambda-Funktion ein Element aus einem Vektor in C zu entfernen. Das Lambda vergleicht das ID-Feld jedes Geräts im Vektor m_FinalFlagsVec mit einer externen Variablen flagId, der ID des zu verwendenden Geräts entfernt.

Der Compiler löst jedoch den oben genannten Fehler aus, der darauf hinweist, dass die FlagId-Variable nicht in der Erfassungsliste des Lambda enthalten ist. Um dieses Problem zu beheben, müssen wir explizit angeben, welche Variablen aus dem umschließenden Bereich erfasst werden sollen.

<code class="cpp">[flagId](Flag& device)
{
    return device.getId() == flagId;
}</code>
Nach dem Login kopieren

Durch die Aufnahme von flagId in die Erfassungsliste geben wir an, dass das Lambda aus dem umschließenden Bereich auf die Variable flagId zugreift. Es stehen mehrere Erfassungsmodi zur Verfügung:

  • Nach Wert:Die Variable wird in den Abschluss des Lambda kopiert, wodurch sie innerhalb des Lambda unveränderlich wird.

    <code class="cpp">[flagId = std::as_const(flagId)](Flag& device)
    {
      // flagId is immutable within the lambda
    }</code>
    Nach dem Login kopieren
  • Nach Referenz:Die Variable wird direkt im Lambda referenziert, was eine Änderung ermöglicht.

    <code class="cpp">[&flagId](Flag& device)
    {
      // flagId can be modified within the lambda
    }</code>
    Nach dem Login kopieren
  • Durch veränderliche Referenz: Ähnlich wie bei der Erfassung durch Referenz, ermöglicht dem Lambda jedoch, das Erfasste zu ändern Variable.

    <code class="cpp">[mutable flagId](Flag& device)
    {
      // flagId can be modified within the lambda
    }</code>
    Nach dem Login kopieren

Die Auswahl des geeigneten Erfassungsmodus hängt von den spezifischen Anforderungen der Lambda-Funktion ab. Durch die explizite Erfassung von Variablen aus dem umschließenden Bereich können Entwickler Daten innerhalb von Lambda-Ausdrücken effektiv verarbeiten und so sicherstellen, dass ihr Code funktionsfähig und fehlerfrei bleibt.

Das obige ist der detaillierte Inhalt vonWie erfasst man Variablen in Lambda-Funktionen explizit, um Kompilierungsfehler zu beheben?. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!

Quelle:php
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
Über uns Haftungsausschluss Sitemap
Chinesische PHP-Website:Online-PHP-Schulung für das Gemeinwohl,Helfen Sie PHP-Lernenden, sich schnell weiterzuentwickeln!