ここで何が起きてるの?
const int a = 0;
const int *pa = &a;
int *p = const_cast<int*>(pa);
*p = 1; // undefined behavior ??
cout << a << *p; // ??
私のコンパイラは 0 と 1 を出力しますが、'a' のアドレスと 'p' の値は同じです。
ここで何が起きてるの?
const int a = 0;
const int *pa = &a;
int *p = const_cast<int*>(pa);
*p = 1; // undefined behavior ??
cout << a << *p; // ??
私のコンパイラは 0 と 1 を出力しますが、'a' のアドレスと 'p' の値は同じです。
cppreferenceからの引用:
const_cast は任意のポインターまたは参照から constness または volatility を削除する場合がありますが、結果のポインターまたは参照を使用して、const と宣言されたオブジェクトに書き込むか、または volatile と宣言されたオブジェクトにアクセスすると、未定義の動作が呼び出されます。
そうです、定数変数の変更は未定義の動作です。表示される出力は、 の値が変更されないことをコンパイラに伝えるという事実によって引き起こされるため、変数のa
代わりにリテラル 0 を行に入れることができます。a
cout
const 値に書き込もうとすることは未定義の動作です。たとえば、コンパイラがconst
値を読み取り専用メモリ (通常はコード セグメント) に割り当てたり、コンパイル時にその値を式にインライン化したりすることができます。これはあなたの場合です。