Heim >Backend-Entwicklung >C++ >Können C 0x Lambda Captures geändert werden, ohne konstant zu sein?

Können C 0x Lambda Captures geändert werden, ohne konstant zu sein?

DDD
DDDOriginal
2024-10-30 13:28:01853Durchsuche

Can C  0x Lambda Captures Be Modified Without Being Const?

Können C 0x-Lambda-Erfassungen geändert werden, ohne konstant zu sein?

Lambda-Erfassungen in C 0x erfassen normalerweise Variablen durch Referenz, die von Natur aus konstant sind . Bestimmte Szenarien erfordern jedoch die Änderung erfasster Variablen, was die Frage aufwirft: „Können erfasste Werte nicht-konstant gemacht werden?“

Betrachten Sie einen Bibliotheksfunktor, foo, mit einer nicht-konstanten Methode, „operator()“, das muss innerhalb eines Lambda aufgerufen werden. Das folgende Codefragment versucht dies, kann jedoch nicht kompiliert werden:

<code class="c++">struct foo
{
  bool operator () ( const bool &amp; a )
  {
    return a;
  }
};

auto bar = [=] () -> bool
{
  afoo(true);
};</code>

Der Kompilierungsfehler tritt auf, weil der Operator() des Lambda implizit als const markiert ist, da die erfassten Werte konstant sind. Um dieses Problem zu lösen, stellt C 0x das Schlüsselwort mutable bereit.

<code class="c++">auto bar = [=] () mutable -> bool
{
  afoo(true);
};</code>

Durch das Hinzufügen von mutable ist der Operator() des Lambda nicht mehr konstant, sodass die erfassten Variablen innerhalb des Lambda geändert werden können. Dies ermöglicht die Änderung von Bibliotheksfunktoren oder anderen nicht konstanten erfassten Werten nach Bedarf innerhalb von Lambdas.

Das obige ist der detaillierte Inhalt vonKönnen C 0x Lambda Captures geändert werden, ohne konstant zu sein?. 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