2017-07-20 5 views
3

Ich habe keine Themen gefunden, die sich auf mutable const auf SO beziehen. Ich habe den Code auf minimalen Arbeitscode reduziert (im Visual Studio). Wenn wir //*data = 11; auskommentieren, beschwert sich der Compiler über Const-Ness. Ich frage mich, wie mutable const funktioniert.Was ist veränderbar const?

class A 
{ 
public: 

    void func(int & a) const 
    { 
     pdata = &a; 
     //*pdata = 11; 
    } 

    mutable const int * pdata; 
}; 

int main() 
{ 
    const A obj; 

    int a = 10; 
    obj.func(a); 
} 
+0

Dieser Code sieht ziemlich wie Unsinn ... – deviantfan

+0

Ich habe die Fähigkeit, mehr Sinn in ein Beispiel zu setzen. –

+0

[Dies wäre ein bisschen interessanter ein Beispiel.] (Http://ideone.com/g2ACsP) Beachten Sie, wie wir ein Mitglied in einem const-Objekt ändern. – user4581301

Antwort

2

mutable const klingt wie ein Oxymoron, aber es hat tatsächlich eine vollkommen vernünftige Erklärung. const int * bedeutet, dass der Zeiger auf den ganzzahligen Zeiger nicht durch diesen Zeiger geändert werden kann. mutable bedeutet, dass der Zeiger selbst so geändert werden kann, dass er auf ein anderes int-Objekt zeigt, auch wenn das Objekt A, dem das pdata-Element angehört, selbst const. Auch hier kann der angezeigte Wert nicht durch diesen Zeiger geändert werden, aber der Zeiger selbst kann erneut gesetzt werden.

Ihr Code schlägt fehl, wenn die Zuweisungsanweisung unkommentiert ist, da diese Zuweisung Ihr Versprechen verletzt, den angezeigten Wert nicht zu ändern (der const int *-Teil).

+2

Ich dachte veränderlich meinte nur "nicht const". Selbst wenn das Objekt const ist. klingt, als sprichst du von volatil statt veränderlich. Matts Antwort klingt eher nach dem, was ich erwartet habe. – xaxxon

+0

Sorry ... du hast Recht. Gehirnfurz. Editing now - stand by. –

6

Dieses Beispiel ist etwas verwirrend, da das Schlüsselwort mutable nicht Teil des Typspezifizierers const int * ist. Es ist wie eine Speicherklasse wie static analysiert, so die Erklärung:

mutable const int *pdata; 

sagt, dass pdata zu einem const int ein veränderlicher Zeiger ist.

Da der Zeiger veränderbar ist, kann er in einer const-Methode geändert werden. Der Wert, auf den es zeigt, ist const und kann nicht durch diesen Zeiger geändert werden.

+0

Das ist komisch; Ich hätte gedacht, das würde aussehen wie 'const int * veränderbare pdata; 'Aber ich denke, es macht Sinn – Justin

4

Sie haben richtig verstanden, dass ein mutable const Klassenmitglied bedeutungslos ist. Ihr Beispiel zeigt mehr eine Art, wie const mit Zeigern funktioniert.

Betrachten Sie die folgende Klasse.

class A { 
    const int * x; // x is non-const. *x is const. 
    int const * y; // y is non-const. *y is const. 
    int * const z; // z is const. *z is non-const. 
}; 

So hat const verschiedene Bedeutungen, je nachdem, wo Sie es schreiben.

Da x und y nicht konstant sind, besteht kein Widerspruch darin, sie änderbar zu machen.

Verwandte Themen