2013-06-25 25 views
-3

我試着執行下面的程序。C++ const_cast不會刪除變量的常量

#include<iostream> 
using namespace std; 
int main() 
{ 
const int a = 0; 
cout << &a <<endl; 
int* ptr = const_cast<int*>(&a); 
*ptr = 2; 
cout << ptr <<endl; 
cout << *ptr <<endl; 
cout << a <<endl; 
return 0; 
} 

產量爲:

0xbf92ebd8 
    0xbf92ebd8 
    2 
    0 

據我所知,做的const_cast一個可變,這樣,就可以改變的。當我顯示* ptr時,反映的變化會反映出來,但是變化未反映在a中。 任何人都可以解釋嗎?編輯: 感謝您的所有答案。我知道我正在觀察一個未定義的行爲。而且,我最初在可變的和* const_cast *之間混淆。 但是,那麼你能告訴我所有的場景嗎,我們使用const_cast嗎?

+1

AFAIR,修改常量變量被認爲是未定義的行爲。你可能期望發生任何事情。 – Spook

+5

這是未定義的行爲。 'a'確實是const,所以你不能在不調用UB的情況下拋棄const。 – juanchopanza

+1

編譯器很可能會將所有'a'的實例優化爲實際值。 –

回答

4

C++03 5.2.1 const_cast /7

[注意:根據對象的類型,通過指針,左值或指針數據成員從該轉換丟失了一個const限定符可以const_cast類型轉換造成的寫操作產生未定義的行爲(7.1.5.1)。 ]

7.1.5.1 The cv-qualifiers /4

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

而且,在術語和定義部分:

[注:允許未定義行爲從範圍與不可預知的結果完全無視的情況,在一個文件翻譯或程序執行期間表現(有或者沒有發佈診斷消息)的環境特徵,終止翻譯或執行(通過發佈診斷消息)。

對最新標準進行了細微的修改,但總體思路仍然存在。底線,不要這樣做。

1

C++ 11標準表示:

7.1.6.1
(...)
4除了任何類成員聲明可變(7.1.1)可以被修改,任何企圖修改對象在其生命週期(3.8)中會導致未定義的行爲。

這意味着,當你試圖做到這一點時,你不能指望任何事情。它可能工作,它可能不會,可能拋出異常,程序可能會被終止,這取決於編譯器的設計者如何設計它。