2013-05-12 154 views
2

對於以下片斷,爲什麼const_cast不會修改調用函數中的值?

#include <iostream> 
using namespace std; 

void fun(const int *p) 
{ 
    int *q = const_cast<int *>(p); 
    *q = *q * 10; 
    cout<<"q: "<<q<<"\t Value: "<<*q<<endl; 
} 

int main() 
{ 
    const int a = 10; 
    const int *z = &a; 
    fun(z); 
    cout<<"z: "<<z<<"\t"<<"Address of a: "<<&a<<endl; 
    cout<<"value at z: "<<*z<<"\t\t value in a: "<<a<<endl; 
} 

產生的輸出是

q: 0x7fff65910fcc Value: 100 
z: 0x7fff65910fcc Address of a: 0x7fff65910fcc 
value at z: 100  value in a: 10 

爲什麼即使我試圖修改它在樂趣的值不被修改()?

a和指針z的地址是如何相同,但值是不同的?

它是一種未定義的行爲與const_cast?

+0

請注意,編譯器可能要使用你給他關於常量性的信息來進行一些優化。(這是拍攝約常量性照顧的第二個原因,第一個是「不錯的代碼「告訴程序員它不會觸及你的數據) – leemes 2013-05-12 09:45:27

回答

9

這是一種未定義的行爲與const_cast?

是的,您的程序包含未定義的行爲。

這意味着你不能對它的輸出有任何期望。其原因是由C++ 11標準第7.1.6.1/4給出:

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

段落上const_cast 5.2.11/7包含一個進一步警告:

[:取決於不g,通過指針,左值或指針 寫入數據成員從const_cast丟棄const-限定符可能會產生未定義的 行爲(7.1.6.1)。 - 注完]

+1

基本上你可以使用'const_cast'來拋棄'const'而不是僅僅是'const'的東西。編譯器可以自由地將'const'對象存儲在ROM中,或者進行優化,假設它們永遠不會改變(比如改變print語句來打印一個常量編譯時間值,或者其他任何感覺) – Yakk 2013-05-12 09:51:34

相關問題