以下のコード スニペットを検討してください。
int main()
{
const int i=3;
int *ptr;
ptr=const_cast<int*>(&i);
*ptr=5;
cout<<"i= "<<i<<endl; <------------------- statement 1
cout<<"*ptr= "<<*ptr<<endl; <------------- statement 2
return 0;
}
私は次のように出力を得ています:
i= 3
*ptr= 5
i
ポインターを介して値が変更されないのはなぜですか?
const として明示的に宣言されている変数の const-ness をキャストし、その値を変更することは「未定義の動作」であることを知っています。知りたいのですが、「コンパイラーがプログラム内の変数を値に置き換える」のは、コンパイラーの最適化メカニズムですか? これは、ステートメント 1 がコンパイラによって次のように解釈されることを意味します。
cout<<"i= "<<3<<endl;
発言があっても
ptr=const_cast<int*>(&i);
に置き換えられます
ptr=(int*)(&i);
同じ出力が得られます: http://ideone.com/5lzJA