2017-04-14 10 views
0

VC++ 2010的問題:const_cast會與布爾:如果條件忽視

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

爲什麼?

謝謝。

+0

你可以爲VC++ 2010添加一個標籤嗎? –

+0

@ C-Otto:完成,謝謝。 – bernie

+1

聽起來好像編譯器已經將'bNew'的評估優化爲'true',而不管你在第二行做什麼。 –

回答

3

從C++ 03標準的部分7.1.5.1/4:

除了任何類成員聲明mutable(7.1.1)可以被修改,任何嘗試期間修改const對象其壽命(3.8)導致未定義的行爲。

你宣佈bNew是一個const對象,然後通過顯式地鑄造它拿走修改它破壞了類型系統。因此,您調用未定義的行爲,這意味着任何東西都可能發生。

+0

那麼,const_cast的目的是什麼? –

+0

當你100%確定該對象沒有創建const。躲開它。 – Ven

+1

@AcaMiln:主要處理本身不是常量不正確的不良或古老API。例如,假設你需要調用一個接受'MyClass&obj'參數的函數,但你知道這個函數不會修改'obj';它只是缺少參考中的'const'。現在你已經有了一個'MyClass const arg',你需要傳遞給這個函數。這是'const_cast'適合的地方。 –