2017-04-14 3 views
0

VC++ 2010 Problem ignoriert:const_cast mit Bool: if Bedingung

const bool bNew = true; 
const_cast<bool&>(bNew) = false; 
if(bNew)//bNew is false here, but 
{ 
    int i = 0;//this line will be executed 
} 

Warum?

Vielen Dank.

+0

Können Sie ein Tag für VC++ 2010 hinzufügen? –

+0

@ C-Otto: fertig, danke. – bernie

+1

Es klingt, als hätte der Compiler die Auswertung von 'bNew' auf' true' optimiert, unabhängig davon, was Sie in der zweiten Zeile tun. –

Antwort

3

Aus dem Bereich 7.1.5.1/4 des C++ 03-Standard:

Abgesehen davon, dass jeder Teilnehmer, erklärt mutable (7.1.1) modifiziert werden kann, jeder Versuch, ein const Objekt während seiner ändern Lebensdauer (3.8) führt zu undefiniertem Verhalten.

Sie erklärt bNew ein const Objekt zu sein, dann Sie den Typ System durch explizites Casting es untergraben entfernt, ihn zu ändern. Sie haben daher undefiniertes Verhalten aufgerufen, was bedeutet, dass irgendetwas passieren kann.

+0

Also, was ist der Zweck von const_cast? –

+0

Wenn Sie 100% sicher sind, dass das Objekt nicht erstellt wurde, const. Vermeide es. – Ven

+1

@AcaMiln: Hauptsächlich mit schlechten oder alten APIs, die selbst nicht korrekt sind. Angenommen, Sie müssen eine Funktion aufrufen, die ein 'MyClass & obj'-Argument akzeptiert, obwohl Sie wissen, dass diese Funktion' obj' nicht ändert; es fehlt nur das "const" in der Referenz. Jetzt haben Sie ein 'MyClass const arg', das Sie an diese Funktion übergeben müssen. Hier wäre ein 'const_cast' angebracht. –