2012-03-08 11 views
1

可能性の重複:
const_cast <int*> does not work。どうして?

const_casting question

次のコードがintのconstの値を変更しようとします。しかしそれはaとbの両方が同じメモリアドレスを指すが、異なる値を表示するように思える。なぜ誰かが説明できますか?

const int a = 5; 
int *b = const_cast<int*>(&a); 
*b = 7; //not working why?? 
cout<<"\nConst Cast: "<<a<<" "<<&a; 
cout<<"\nConst Cast: "<<*b<<" "<<b; 
cout<<"\nConst Cast: "<<a<<" "<<&a; 

/* Output 
Const Cast: 5 0027F7FC 
Const Cast: 7 0027F7FC 
Const Cast: 5 0027F7FC 
*/ 
+7

あなたは 'a'の値を変更しないことを約束したことをコンパイラに伝えました。その後、2行後に約束を破って変更します。これは未定義の動作を呼び起こしています。これは、すべての目的と目的で「** DO NOT DO IT ** **」を意味します。 –

+0

'const int a = 4;'を実行したときには、コンパイル時に評価できる定数式を 'a'に代入しています。実際には 'a'の値が変わりました。非const式で 'a'を設定しようとすると、期待した結果が得られます。 – AlexDan

答えて

4

あなたはコンパイラに嘘をつきました。あなたはaがconstだったと言っていたので、それは先ほどと同じように扱い、aのインスタンスをコンパイル時定数5に置き換えました。

未定義の動作です。

5

const_cast定数オブジェクトを変更することはできませんが、参照オブジェクト/ポインタの定数を非constオブジェクトにドロップし、ライブラリが存在しない古い壊れたインタフェースを呼び出すことはできません変更するが、非constポインタを取った。 のオブジェクトを変更するのはです。constは未定義の動作です。

あなたは実用的なテストを受けています。コンパイラがコンパイル時定数a(これは5と約束していた)の値を関数内のさまざまな用途に置き換えた可能性があります。 aの場合、コンパイラは5を印刷していますが、値を読み取っていません。

関連する問題