const_cast
は、最初にconst
と定義されていなかったオブジェクトへのポインタをconst
と受け取った場合に通常使用されます。オブジェクトが元々const
として定義されていた場合、そのオブジェクトを変更しようとすると未定義の動作が発生します。 const_cast
がなければ、コンパイラはそれをやろうとしません(コードはコンパイルされません)。
キャストは、しかし、あなたは何をやっている知っている確信していると、コンパイラはただ黙ってあなたの代わりに任意のエラー/警告メッセージを与えることを言ったことを行う必要があるので、それは、本当に安全なのコンパイラに指示します通常と同じように。残念なことに、この場合はではなく、は本当に安全ですが、コンパイラにシャットダウンして実行するように指示しているので、少なくともほとんどのコンパイラで警告は表示されません。
あなたがするべきことは、k
が本当にconstかどうかを判断することです。本当にそれを変更する必要がある場合は、それを通常(非const
)変数として定義する必要があります。あなたが特定のコードの少量のみがそれを修正することができるようにしたい場合は、/(一つの可能性のための)小さなクラスにそれはプライベート作ることができる可能性があり:今
class my_int {
int k;
public:
my_int() : k(1) {}
do_mod() { k = 10; }
operator int() { return k; }
};
、do_mod
は直接k
を変更することができます。他のコードでは、int
であるかのようにmy_int
オブジェクトを使用できますが、その値を変更することはできません。本質的には、それは右辺値のように動作します。
は公平に、私はおそらくいくつかの鋳造を行って、それ本当に試みは、他のコードがk
の値を変更することができるかどうかということを指摘すべきです。 Bjarne氏によると、C++の保護メカニズムは意図的な破壊ではなく、事故を防ぐためのものです。
コンパイラは 'const'オブジェクトを読み出し専用メモリに置くことができます。この場合、このプログラムはアクセス違反でクラッシュする可能性があります。 –
constとして定義されているオブジェクトからconstnessをキャストすると、未定義の動作が発生します。それほどコストがかからないオブジェクトを指す参照からconstを外した場合。 –