2012-04-24 12 views
0

const_castの使い方を理解しようとしました。次のようなコード:const_cast C++が私のために機能しませんでした

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

...ランタイムエラーが発生します。

メモリ内で、この領域がconstであるかどうかをランタイム(その)がどのように知っていますか?これはどのようなフラグですか?

+0

IMHO - キャストを使用するのは悪い考えです。キャストを避け、必要な場合にのみ使用してください。私は、キャストを使用する人々がデザインに何か間違っているという強い感情を持っています。 –

答えて

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 
+0

string constが失敗しなければならない理由は何ですか?ここであなたのポイントは何ですか? – Moatz

+0

@Moatz:文字列リテラルに書き込むとクラッシュやエラーメッセージが出るという保証はありません。 –

0

文字列が静的メモリに格納されている可能性があります。したがって、未定義の動作です。 あなたは本当にconstのではありません知っているだけではconst_cast何かすることができます。この

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

を試してみてください。この場合、テキストがconstであっても、constではないtを指していることがわかります。したがって、私たちは安全にconstをキャストできます。

+0

2-どのようにいくつかのC++関連の質問については、stackoverflowからの通知を取得? 3-アドバイスどのようにこの本を入手するには:ロバートSedgewickアルゴリズムのC + +のpart1-4 最高、 – Moatz

+0

どのように文字列を静的に入れますか? t []とchar *の違いは何ですか? – Moatz

+0

'char []'は配列です。 'char *'は 'char []'や '' blah''や 'malloc(n)'を使って作成されるcharへのポインタです。 – balki

0

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

実行時にconstのことを「知って」いることを強制したい場合は、const変数に書き込むと、/(特定の例外をスローするなど)特定の動作が指定される可能性があります。システムによっては、それを非常に簡単にサポートするシステムもあれば、そうでないシステムもありますので、特定の応答は必要ありません。

関連する問題