const_cast の使用法を理解しようとしています。次のようなコード:
const char* text="bb";
(const_cast<char&>(*text))='a';
cout<<*text;
...実行時エラーを生成します。
別の質問、メモリ内で、ランタイム (それ) は、この領域が const であるかどうかをどのように認識しますか?これはどのようなフラグですか?
そのコードは未定義の動作を呼び出します。文字列リテラルへの書き込みは有効ではありません (実際にはconst
オブジェクトへの書き込みも無効です)。
C++ 標準では、これがどのように失敗するか (または失敗する必要があるかどうかさえ) を定義していません。しかし、典型的なプラットフォームでは、問題を検出するのは OS と基盤となるハードウェア次第です。通常、ストレージ"bb"
は実行可能ファイルの専用セクションにあり、読み取り専用としてマークされています。たとえばhttp://en.wikipedia.org/wiki/Memory_protectionを参照してください。
const_cast
ただし、未定義の動作を呼び出さない用途があります。例えば:
int x = 5; // Not a const object
const int *p = &x;
int *q = const_cast<int *>(p);
*q = 6; // This is ok
文字列は静的メモリに配置される場合があります。したがって、これは未定義の動作です。これを試して
char t[]="bb";
const char* text = t;
(const_cast<char&>(*text))='a';
cout<<*text;
実際には const ではないことがわかっているものだけを const_cast できます。この場合、テキストが const であっても、const ではない t を指していることがわかります。したがって、const を安全にキャストできます。
一般に、ランタイムは、特定の変数が実際に であるかどうかを知りませんconst
。-nessをキャストするconst
と、constとして定義された変数に書き込むことになると、未定義の動作が発生します(通常の変数にたまたまconstポインター/参照があるのとは対照的です)。
ランタイムがconst
. 一部のシステムはそれを非常に簡単にサポートしますが、他のシステムはサポートしないため、特定の応答は必要ありません。