次のコードがあります。
int main(){
const int a = 1;
const int* b(&a);
int* c = const_cast<int*>(b);
*c = 29;
cout<<*c<<a<<*b;
return EXIT_SUCCESS;
}
「a」の値が 29 に変わらないのはなぜですか? これは、b を const_casting するときに a の constness が削除されないということですか?
次のコードがあります。
int main(){
const int a = 1;
const int* b(&a);
int* c = const_cast<int*>(b);
*c = 29;
cout<<*c<<a<<*b;
return EXIT_SUCCESS;
}
「a」の値が 29 に変わらないのはなぜですか? これは、b を const_casting するときに a の constness が削除されないということですか?
定数変数により、コンパイラは特定の最適化も行うことができます。これらの 1 つは、コンパイラが値をレジスタに保持し、再読み込みしないようにすることです。これによりパフォーマンスが向上しますが、変数を再読み込みする必要があるため、変更される変数では機能しません。一部のコンパイラは、変数を割り当てるのではなく、単に値をインラインで置き換えることによって定数を最適化します。変数 a を変更すると、int
代わりに動作します。これは、IBMconst int
のオペレーターに関するドキュメントで読むことができます。const_cast
const として明示的に宣言されたオブジェクトの constness をキャストし、それを変更しようとすると、結果は未定義になります。
発生している問題と、それが機能しない理由についての詳細は、次の場所で確認できます。
余談ですが、 を使用する必要があるconst_cast
場合は、代わりに設計を再検討する必要がある可能性が高いことに注意してください。