Const und veränderbar

8

Ich bin gerade auf dieses Codefragment gestoßen, aber ich verstehe nicht, wie es kompiliert:

%Vor%

Was bedeutet diese Zeile?

%Vor%

value1 wird ohne Fehler zu 10 zugewiesen. Aber value1 ist nicht mutable . Wie kompiliert sich das?

    
Phani 26.08.2015, 18:11
quelle

3 Antworten

11

Wenn eine Elementvariable nicht das Qualifikationsmerkmal mutable hat, können Sie sie nicht ändern, wenn ein Objekt const ist.

Wenn eine Elementvariable das Qualifikationsmerkmal mutable hat, können Sie sie ändern, auch wenn ein Objekt const ist.

Einfaches Beispiel:

%Vor%

Wenn Sie haben:

%Vor%

Sie umgehen die const -ness des Objekts und ändern es so, wie Sie es nicht sollten. Dies unterliegt nicht definiertem Verhalten.

Soweit der Compiler betroffen ist, entspricht dieser Code:

%Vor%     
R Sahu 26.08.2015, 18:24
quelle
2

Die Zeile

%Vor%

wird gesagt, dass " const -ness" weggeworfen wird. Im Grunde sagt es dem Compiler: Nimm den this -Zeiger (der den Typ temp const* hat, weil wir uns in einer const -Memberfunktion von temp befinden), und tue so, als wären sie vom Typ temp* (der Unterausdruck (temp*)this ). Dann weist es den Compiler an, diesen Zeiger vom Typ temp* zu dereferenzieren, um eines seiner Mitglieder zu ändern.

Wegwerfen von const -ness war, wie änderbare Datenelemente implementiert wurden, bevor C ++ das Schlüsselwort mutable angeboten hat.

Wie Sie vielleicht vermutet haben, ist das eine schlechte Übung. Es ist eine schlechte Übung, weil es genauso gut mit dem Modifikator mutable ausgedrückt werden könnte. Und es ist eine schlechte Übung, weil es die große Kanone eines C-Style-Casts benutzt, wo ein C ++ const_cast<> ausgereicht hätte.

    
cmaster 26.08.2015 20:05
quelle
1

Der beste Weg zu lernen ist, es zu einem trivialen Fall zu machen und zu sehen, wie es geht.

a) Wenn Sie auskommentieren (* temp) und etwas ähnliches machen this- & gt; value1 = 10;

  

Fehler: Zuordnung von Datenelement 'temp :: value1' in schreibgeschützter Struktur

oder

b) Wenn Sie ein veränderbares Schlüsselwort auskommentieren, erhalten Sie denselben Fehler

  

Fehler: Zuweisung von Datenelement 'temp :: value2' in schreibgeschützt   Struktur

und wenn du oben gelesen hast, hat R Sahu die richtige Antwort über veränderbares Schlüsselwort gegeben.

Wenn Sie verwirrt sind, warum können wir den Wert nicht auf die normale Weise ändern, denken Sie daran, dass die Funktion const und const ein Vertrag ist, der verspricht, dass wir hier keine Werte ändern oder zuweisen sollen (aber veränderbar). also zeigt es im Grunde zwei Techniken oder Hacks, um das Versprechen zu brechen :-)

    
Naumann 26.08.2015 18:27
quelle

Tags und Links