mutable überflüssig?
-
Dafür gibts doch const_cast<>?
-
jein. const_casts sind dazu da, um etwas, was eigentlich wirklich const sein sollte, zu einer Änderung zu zwingen. mutables zeigen an, dass z.B. eine Membervariable sich verändern kann, auch wenn das Objekt const ist.
-
const_cast <> zu verwenden ist nicht so dolle. Wenn ich ein Element als konstanten Parameter oder Rückgabewert übergebe, dann erwarte ich auch, dass dieser nicht verändert wird.
Ansonsten kann man sich das const auch gleich sparen...
(Schnittstelle wird ausgehebelt)mutable ist ein ganz anderes Kaliber. Damit zeige ich an, dass die Variable nicht zum Objektzustand gehört.
Variablen, die nicht zum Objektzustand gehören sind z.B. Puffer oder zusammengesetzte Attribute. Diese müssen intern auch von konstanten Funktionen aktualisiert werden...
Damit kann man zum Beispiel zusammengesetzte Attribute (z.B. Puffer) die den Objektzustand nicht verändert auch innerhalb von konstanten Funktionen aktualisieren.
(Änderung erfolgt durch über oder durch die Schnittstelle)
-
mutable ist ein anderes konzept als das c++ sprachelement "const". man kann mit const auf immutables hinweisen, aber ob ein objekt tatsächlich mutable oder immutable ist, ist von der implementierung abhängig.
-
Mit 'mutable' kannst du gezielt freigeben, welche Klassenmember von den const-Beschränkungen ausgenommen werden sollen - const_cast<> ist im Vergleich dazu die Holzhammer-Methode (und entsprechend gefährlich).
(und bei gutem Design sollte der Anwender gar nicht bemerken, wenn ein mutable-Wert sich ändert)
-
Mutierter Programmierer schrieb:
Dafür gibts doch const_cast<>?
(Mal abgesehen davon, dass ich einfach sagen würde: "Nein - mutable ist nicht überflüssig")
Kann man denn überhaupt "this" const_cast-en ?
Darum geht's doch bei mutable: In einer const-Memberfunktion den Objektzustand "irrelevant" ändern zu können....Gruß,
Simon2.
-
Simon2 schrieb:
Kann man denn überhaupt "this" const_cast-en ?
Man kann und man darf, wenn man sicher ist, dass das ursprüngliche Objekt non-const ist.
Auch dazu mal ein Beispiel von Meyers
class MyClass { T const& operator[]( size_t index ) const { ... } T& operator[]( size_t index ) { return const_cast< T& >( const_cast< MyClass const* >( this )->operator[]( index ) ); } };Weil ich im non-const operator[] weiss, dass this non-const ist, darf ich auch das const vom konstanten operator[] wegcasten.
-
Ah ... danke.
Jetzt fällt mir auf, dass ich das schonmal gesehen aber nicht unter "const_cast(this)" abgespeichert hatte.
Wird jetzt nachgeholt.Danke,
Simon2.
-
Hi,
mein Compiler (xlC V8.0) beklagt sich "The "mutable" specifier must be applied only to non-reference class data members." ...
Im Std habe ich nichts Derartiges finden können. Hat er Recht (wie eigentlich fast immer) oder spinnt er da ?
Gruß,
Simon2.
-
ISO/IEC 14882, §7.1.1,(8) schrieb:
The mutable specifier can be applied only to names of class data members and cannot be applied to names declared const or static, and cannot be applied to reference members.
da stehts doch im Standard

-
pumuckl schrieb:
ISO/IEC 14882, §7.1.1,(8) schrieb:
The mutable specifier can be applied only to names of class data members and cannot be applied to names declared const or static, and cannot be applied to reference members.
da stehts doch im Standard


Danke!!Ich habe nur "§7.1.1,(9)" gelesen, wo die Funktion von "mutable" erläutert wird. Dass im Nachsatz zu "extern" nochmal eine Einschränkung zu mutable kommt, war mir entgangen ...
Danke nochmal,
Simon2.