In C ++ benötigen const
wir einen benutzerdefinierten Standardkonstruktor , um ein Objekt einer Klasse mit einer Mitgliedsvariablen als zu deklarieren . Der folgende Code veranschaulicht dies.
class Some {
int value;
};
int main() {
// error: default initialization of an object of const type 'const Some'
// without a user-provided default constructor
const Some some;
return 0;
}
Wenn jedoch eine Mitgliedsvariable, die einer Klasse gehört, als veränderbar qualifiziert ist, meldet der Compiler keine Fehler. Als Referenz habe ich mit dem Befehl kompiliert clang++ -std=c++17 -stdlib=libc++ helloworld.cpp -o helloworld.out --debug
. Ich frage mich, ob dieses Ergebnis auf einen Fehler im Compiler oder auf die in der C ++ - Sprache definierte Syntax zurückzuführen ist.
class Some {
mutable int value;
};
int main() {
const Some some;
return 0;
}
mutable
ist das Gegenteil vonconst
. Warum haben Sie den gleichen Effekt erwartet?const
, was bedeutet, dass es nicht geändert werden kann und dass es nicht initialisierte Werte hat, gibt es keine Verwendung für diese Art von Code und deshalb ist es verboten. Wenn Sie dasmutable
Schlüsselwort verwenden, bedeutet dies, dass der Wert später geändert werden kann, sodass der Code auf vorhersehbare Weise verwendet werden kann.Antworten:
Ich schreibe meinen Kommentar als Antwort um und hoffe, er könnte jemandem helfen.
Es macht keinen Sinn, ein const-Objekt zu deklarieren, wenn es nicht in irgendeiner Form initialisiert ist.
Betrachten Sie den folgenden Code:
Clang sagt :
error: default initialization of an object of const type 'const int'
.gcc würde sagen:
error: uninitialized const ‘x’ [-fpermissive]
Die Logik dahinter ist, dass diese Art der Deklaration keinen Sinn hat .
Der Wert von
x
kann sich niemals ändern, und daher wäre dieser Code unvorhersehbar, da erx
einem nicht initialisierten Speicher zugeordnet würde.In Ihrem Beispiel bedeutet das Hinzufügen des Schlüsselworts
mutable
zuvalue
, dass dieSome
Instanz zwar konstant ist, wenn sie wie folgt deklariert wird:Es ist noch möglich,
value
zu einem späteren Zeitpunkt zu ändern .Zum Beispiel:
Dies bedeutet, dass es möglich ist, diesen Code auf vorhersehbare Weise zu verwenden, da
value
später festgelegt werden kann und keine nicht initialisierten Konstanten vorhanden sind.quelle