0

const_cast の使用法を理解しようとしています。次のようなコード:

const char* text="bb";
(const_cast<char&>(*text))='a';
cout<<*text;

...実行時エラーを生成します。

別の質問、メモリ内で、ランタイム (それ) は、この領域が const であるかどうかをどのように認識しますか?これはどのようなフラグですか?

4

3 に答える 3

8

そのコードは未定義の動作を呼び出します。文字列リテラルへの書き込みは有効ではありません (実際には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
于 2012-04-24T18:31:50.177 に答える
0

文字列は静的メモリに配置される場合があります。したがって、これは未定義の動作です。これを試して

char t[]="bb";
const char* text = t;
(const_cast<char&>(*text))='a';
cout<<*text;

実際には const ではないことがわかっているものだけを const_cast できます。この場合、テキストが const であっても、const ではない t を指していることがわかります。したがって、const を安全にキャストできます。

于 2012-04-24T18:33:22.253 に答える
0

一般に、ランタイムは、特定の変数が実際に であるかどうかを知りませんconst。-nessをキャストするconstと、constとして定義された変数に書き込むことになると、未定義の動作が発生します(通常の変数にたまたまconstポインター/参照があるのとは対照的です)。

ランタイムがconst. 一部のシステムはそれを非常に簡単にサポートしますが、他のシステムはサポートしないため、特定の応答は必要ありません。

于 2012-04-24T18:35:37.950 に答える