Ich wollte ein Memorierungsmuster in C ++ schreiben und endete mit dem folgenden Ansatz
%Vor%Seltsamerweise weigerte sich mein Compiler VS 2012, mit dem folgenden Fehler zu kompilieren
%Vor%Es scheint mir, dass der Compiler absichtlich alles nach Wert als ein konstantes Objekt erfasst. Ich kann keinen dokumentierten Hinweis auf dieses Verhalten finden.
Kann mir irgendjemand helfen zu verstehen, was hier möglicherweise passiert?
Lambdas verhalten sich mehr oder weniger wie Funktionsobjekte; Wie ein Funktionsobjekt haben sie einen Funktionsaufrufoperator, d.h. operator()
. Für nicht mutable
lambdas ist diese Funktion const
:
[expr.prim.lambda]
5 Der Verschlusstyp für einen nicht-generischen Lambda-Ausdruck hat eine öffentliche Inline-Funktion Aufrufoperator [...] Dieser Funktionsaufrufoperator oder Die Operatorvorlage wird nur dann als
const
(9.3.1) deklariert, wenn der Die Parameter-Deklaration-Klausel von Lambda-Ausdruck ist nicht gefolgt vonmutable
.
Da von der Kopie erfasste Entitäten sich so verhalten, als wären sie Membervariablen des Lambda:
15 [...] Für jedes von copy erfasste Objekt wird ein nicht benanntes nicht statisches Datenelement im Verschlusstyp deklariert.
und nicht mutable
Mitglieder können nicht in einer const
Mitgliederfunktion ([class.this] / 1, [dcl.type.cv] / 4) geändert werden, wenn Sie möchten Um die erfassten Entitäten zu ändern, müssen Sie mutable
lambda deklarieren.
Wie es aussieht, sieht dein Lambda so aus:
%Vor% Sie können sich eine mutable
Lambda als eine nicht const
operator()
vorstellen, in Ihrem Fall kann das Lambda wie folgt definiert werden:
Tags und Links c++ lambda c++11 visual-c++