3
// OK!
volatile CString* a0;
CString* a1 = const_cast<CString *>(a0);

// error C2440: 'const_cast' : cannot convert from 'volatile CString' to 'CString'
volatile CString b0;
CString b1 = const_cast<CString>(b0);

私は疑問に思っていましたが、なぜconst_castポインターでしか機能しないのですか? コンパイルする2番目のケースを作成するにはどうすればよいですか?

4

2 に答える 2

10

const_castポインターと参照に作用し、修飾子を削除constします。volatileオブジェクト型にキャストするためにそれを使用するのは意味がありません。なぜなら、オリジナルと同じ cv 修飾子を持つ必要がないコピーを作成するからです。

不揮発性参照にキャストすると、2番目の例がコンパイルされます。

volatile CString b0;
CString & b1 = const_cast<CString &>(b0);

ただし、その参照を使用すると、基になるオブジェクトがそれ自体であるため、未定義の動作が発生しますvolatile。基礎となるオブジェクトがそれらの資格を持っていないことがわかっている場合 (または、結果がオブジェクトの変更に使用されないことがわかっている場合) にのみ資格を削除const_castするために使用する必要があります。const

オブジェクトが volatile オブジェクトのコピーを許可している場合にのみ、コピーを取得できます (おそらく、コピー コンストラクターが volatile への参照、または volatile 修飾された関数または変換演算子を使用する場合)。CStringこれらのいずれも提供しない場合volatile、そのタイプのオブジェクトを安全にコピーすることはできません。

于 2011-11-18T11:20:56.470 に答える
0

2番目のケースでは、実際にはコピーb0していて、元のオブジェクトを参照していないためです

その場合は参照を行う必要があります

const CString &b1 = b0;
于 2011-11-18T11:16:48.670 に答える