それらは正しいです、それは未定義の振る舞いです。変数の値を変更することは許可されていません。これは、何かconst
の本質を捨てる危険性があります。実際にはそうではないことをよく知っています。const
const
コンパイラーmaxint
は、それが変更されていることconst
、および変更されるべきではないことを認識しているため、アドレスを指定する必要さえありません。maxint
適切と思われる場合は、のすべての用途を100に置き換えることができます。また、Matteo Italiaが指摘しているように、メモリの読み取り専用の部分に定数を入れるだけかもしれません。これはおそらくあなたに起こっていることです。そのため、変更すると未定義の動作が発生します。
変数の性質を安全に捨てることができる唯一の方法const
は、変数が実際const
にはない場合ですが、const
修飾子はconst
次のように非変数に追加されました。
int f(const int& x) {
int& nonconst = const_cast<int&>(x);
++nonconst;
}
int blah = 523;
f(blah); // this is safe
const int constblah = 123;
f(constblah); // this is undefined behaviour
完全にコンパイルされるこの例について考えてみてください。
int f(const int& x) {
int& nonconst = const_cast<int&>(x);
++nonconst;
}
int main() {
f(4); // incrementing a number literal???
}
変数が元々あるかどうかを実際に判断する方法がないため、使用const_cast
が非常に危険であることがわかりますconst
。可能な場合は使用を避ける必要があります(関数では、パラメーターconst_cast
を受け入れないだけです)。const