Lambda Capture by Value erzwingt das gesamte Objekt auf const

8

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?

    
Abhijit 31.10.2014, 04:22
quelle

2 Antworten

14

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 von    mutable .

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:

%Vor%     
user657267 31.10.2014, 04:25
quelle
6

Um eine Lambda-Funktion nicht-konstant zu machen, müssen Sie das mutable -Schlüsselwort hinzufügen:

%Vor%     
Galik 31.10.2014 04:25
quelle

Tags und Links