const_castの使い方を理解しようとしました。次のようなコード:const_cast C++が私のために機能しませんでした
const char* text="bb";
(const_cast<char&>(*text))='a';
cout<<*text;
...ランタイムエラーが発生します。
メモリ内で、この領域がconstであるかどうかをランタイム(その)がどのように知っていますか?これはどのようなフラグですか?
const_castの使い方を理解しようとしました。次のようなコード:const_cast C++が私のために機能しませんでした
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
string constが失敗しなければならない理由は何ですか?ここであなたのポイントは何ですか? – Moatz
@Moatz:文字列リテラルに書き込むとクラッシュやエラーメッセージが出るという保証はありません。 –
文字列が静的メモリに格納されている可能性があります。したがって、未定義の動作です。 あなたは本当にconstのではありません知っているだけではconst_cast何かすることができます。この
char t[]="bb";
const char* text = t;
(const_cast<char&>(*text))='a';
cout<<*text;
を試してみてください。この場合、テキストがconstであっても、constではないtを指していることがわかります。したがって、私たちは安全にconstをキャストできます。
は一般的に、実行時はは、特定の変数が実際にconst
であるかどうか分かりません。 const
-nessをキャストした場合、const(constポインタ/参照を持つ通常の変数とは対照的に)として定義された変数に書き込むと、未定義の動作が発生します。
実行時にconst
のことを「知って」いることを強制したい場合は、const変数に書き込むと、/(特定の例外をスローするなど)特定の動作が指定される可能性があります。システムによっては、それを非常に簡単にサポートするシステムもあれば、そうでないシステムもありますので、特定の応答は必要ありません。
IMHO - キャストを使用するのは悪い考えです。キャストを避け、必要な場合にのみ使用してください。私は、キャストを使用する人々がデザインに何か間違っているという強い感情を持っています。 –