Lambda-Erfassung nach Wert in C 0x immer konstant?
Dieses Problem tritt auf, wenn versucht wird, einen Wert durch Referenz zu erfassen, aber seinen Inhalt darin zu ändern ein Lambda-Ausdruck. Der Compiler behandelt erfasste Werte standardmäßig als Konstanten und stellt so sicher, dass sie unverändert bleiben. Einige Szenarien erfordern jedoch möglicherweise einen nicht konstanten Zugriff auf erfasste Werte.
Erfassung nach Wert verstehen:
In C 0x können Lambda-Funktionen Variablen nach Wert oder Referenz erfassen. Bei der Erfassung nach Wert wird eine Kopie der Variablen innerhalb des Lambda-Bereichs erstellt, sodass Änderungen innerhalb des Lambda möglich sind. Standardmäßig werden erfasste Kopien jedoch als konstant behandelt, wodurch ihre Änderung verhindert wird.
Mutable-Schlüsselwort zur Rettung:
Um diese Einschränkung zu überwinden, kann das Mutable-Schlüsselwort verwendet werden. Indem wir der Parameterliste eines Lambda „mutable“ voranstellen, deklarieren wir den erfassten Wert explizit als änderbar innerhalb des Lambda-Bereichs. Dies ermöglicht den nicht-konstanten Zugriff auf den erfassten Wert und löst das im bereitgestellten Code-Snippet beschriebene Problem.
Beispiel:
Betrachten Sie den folgenden Code, der versucht, einen Wert per Referenz zu erfassen und einen nicht-konstanten Wert aufzurufen Methode:
struct foo
{
bool Operator () ( const bool & a )
{
return a;
}
};
int main()
{
foo afoo;
auto bar = [=] () -> bool
{ afoo(true); };
return 0;
}
In diesem Code wird das Kompilierungsproblem dadurch behoben, dass foo::operator() const erstellt wird. Die Verwendung von mutable direkt im Lambda-Ausdruck bietet jedoch mehr Flexibilität und ermöglicht einen nicht konstanten Zugriff auf den erfassten Wert, ohne die ursprüngliche Deklaration zu ändern
Das obige ist der detaillierte Inhalt vonIst die Lambda-Erfassung nach Wert in C 0x immer konstant?. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!