2014-04-22 25 views
1

請考慮以下代碼:const_cast的奇怪行爲

我聲明一個新的引用結束將它賦值給一個通過const_cast的值。然後,我只需增加參考值即可打印地址和值。

#include <iostream> 
using namespace std; 
int main() 
{ 
    const int a = 7; 
    int &b = const_cast<int&>(a); 
    ++b; 
    cout<<"Addresses "<<&a<<" "<<&b<<endl; 
    cout<<"Values "<<a<<" "<<b<<endl; 
} 

//output 
Addresses 0x7fff11f8e30c 0x7fff11f8e30c 
Values 7 8 

我怎樣纔能有2個不同的值在同一地址?

回答

5

修改常量對象會導致未定義的行爲,因此您的程序可以(原則上)執行任何操作。

使此行爲未定義的一個原因是允許使用其值替換常量變量的優化(因爲您聲明該值永遠不會更改)。這就是在這裏發生的事情:在編譯時a被替換爲值7,所以無論您在運行時嘗試如何使用該值,都會保留該值。

6

由於修改聲明爲const的變量是未定義的行爲,因此從字面上什麼都可能發生。

2

試圖修改一個對象,它本身通過在根據ISO C++標準未定義行爲的const_cast結果手段聲明爲常量。

當我們引用「const對象」時,它打算說對象所在的內存可能是寫保護的。也就是說,const的類型的變量或表達可以表示存儲在寫保護存儲器中的對象的任何企圖修改的對象結果不確定的行爲

編輯:推薦本網站以獲取更多信息

http://www.open-std.org/jtc1/sc22/wg21/docs/papers/1994/N0571.asc