Ich kann nicht viele Informationen finden const_cast
. Die einzige Information, die ich finden konnte (über Stapelüberlauf), ist:
Das
const_cast<>()
wird verwendet, um Konstante (oder Flüchtigkeit) einer Variablen hinzuzufügen / zu entfernen.
Das macht mich nervös. Könnte ein const_cast
unerwartetes Verhalten auftreten? Wenn ja, was?
Alternativ, wann ist es in Ordnung zu verwenden const_cast
?
c++
casting
const-cast
Mag Roader
quelle
quelle
const
Objekt über eine definierteconst
Referenz / einen definierten Zeiger zu ändern . Wenn Sie stattdessen nurconst_cast
eine schlecht (oder in meinem Fall träge) spezifizierte API umgehen möchten, die nur eine Nichtreferenz akzeptiert,const
aber nur inconst
Methoden verwendet wird ... überhaupt kein Problem.Antworten:
const_cast
ist nur dann sicher, wenn Sie eine Variable umwandeln, die ursprünglich nicht warconst
. Wenn Sie beispielsweise eine Funktion haben, die einen Parameter von a übernimmtconst char *
, und eine veränderbare Funktion übergebenchar *
, ist es sicher,const_cast
dass dieser Parameter an a zurückgegebenchar *
und geändert wird. Wenn jedoch die ursprüngliche Variable tatsächlich warconst
, führt die Verwendungconst_cast
zu undefiniertem Verhalten.quelle
§7.1.5.1/4 says Except that any class member declared mutable (7.1.1) can be modified, any attempt to modify a const object during its lifetime (3.8) results in undefined behavior
Jeder Versuch ! Es gibt keine Wörter über die ursprüngliche Variable.const_cast
umconst
etwas zu entfernen , das ursprünglich deklariert wurdeconst
. Aber es ist UB, tatsächlich zu versuchen, in dieses Objekt zu schreiben. Solange Sie gerade lesen, geht es Ihnen gut und dasconst_cast
an sich verursacht keine UB. Es ist eine schreckliche Idee, aber es ist nicht von Natur aus UB.Ich kann mir zwei Situationen vorstellen, in denen const_cast sicher und nützlich ist (es kann andere gültige Fälle geben).
Eine ist, wenn Sie eine const-Instanz, eine Referenz oder einen Zeiger haben und einen Zeiger oder eine Referenz an eine API übergeben möchten, die nicht const-korrekt ist, aber Sie BESTIMMT sind, ändert das Objekt nicht. Sie können den Zeiger const_cast und an die API übergeben, wobei Sie darauf vertrauen, dass er nichts wirklich ändert. Beispielsweise:
Die andere Möglichkeit besteht darin, einen älteren Compiler zu verwenden, der 'mutable' nicht implementiert, und eine Klasse erstellen möchten, die logisch const, aber nicht bitweise const ist. Sie können const_cast 'this' innerhalb einer const-Methode und Mitglieder Ihrer Klasse ändern.
quelle
const_cast
undefiniertes Verhalten verursacht werden kann, nicht welche nützlichen Anwendungen es sindconst_cast
eine gültige Antwort. Es gibt keinehe
Fragen, da die Frage allein das Thema ist.Es fällt mir schwer zu glauben, dass dies die einzigen Informationen sind, die Sie über const_cast finden können. Zitat aus dem zweiten Google-Hit :
quelle
const_cast
. Oder rufen Sie eine const-Methode auf.Was Adam sagt. Ein weiteres Beispiel, bei dem const_cast hilfreich sein kann:
Wir fügen zuerst const zu den Typpunkten hinzu,
this
rufen dann die const-Version von aufgetT
und entfernen dann const aus dem Rückgabetyp, der gültig ist, dat
er nicht const sein muss (andernfalls könnte die nicht-const-Version vongetT
nicht haben wurde genannt). Dies kann sehr nützlich sein, wenn Sie einen großen Funktionskörper haben und redundanten Code vermeiden möchten.quelle
const_cast
oder nichtstatic_cast
.const_cast
kann nur machen was du willst: ändere die cv-qualifiers.static_cast
kann "still" andere Vorgänge ausführen, die Sie nicht beabsichtigen. Die erste Besetzung ist jedoch völlig sicher undstatic_cast
tendenziell sicherer alsconst_cast
. Ich denke, dies ist eine Situation, in der dasconst_cast
Ihre Absicht besserstatic_cast
kommuniziert , aber die Sicherheit Ihrer Handlungen besser kommuniziert.Die kurze Antwort lautet nein, es ist nicht sicher.
Die lange Antwort lautet: Wenn Sie genug wissen, um es zu verwenden, sollte es sicher sein.
Beim Casting sagen Sie im Wesentlichen: "Ich weiß etwas, das der Compiler nicht weiß." Im Fall von const_cast sagen Sie: "Obwohl diese Methode eine nicht konstante Referenz oder einen Zeiger verwendet, weiß ich, dass sie den Parameter, den ich übergebe, nicht ändert."
Wenn Sie also tatsächlich wissen, was Sie bei der Verwendung der Besetzung zu wissen behaupten, ist es in Ordnung, sie zu verwenden.
quelle
Sie zerstören jede Chance auf Thread-Sicherheit, wenn Sie anfangen, Dinge zu ändern, die der Compiler für konstant hielt.
quelle
const
.const
ist Vertrauen.const_cast
bricht dieses Vertrauen :(Quelle: http://publib.boulder.ibm.com/infocenter/comphelp/v8v101/index.jsp?topic=%2Fcom.ibm.xlcpp8a.doc%2Flanguage%2Fref%2Fkeyword_const_cast.htm
quelle