const_cast
acts on pointers and references, to remove const
and volatile
qualifiers. It doesn't make sense to use it to cast to an object type, since then you would making a copy which need not have the same cv-qualifiers as the original anyway.
Your second example will compile if you cast to a non-volatile reference:
volatile CString b0;
CString & b1 = const_cast<CString &>(b0);
However, using that reference gives undefined behaviour, since the underlying object is itself volatile
. You should only use const_cast
to remove qualifications when you know that the underlying object does not have those qualifications (or in the case of removing const
, when you know that the result won't be used to modify the object).
You can only get a copy if the object allows copying of volatile objects (perhaps with a copy constructor taking a reference-to-volatile or a volatile-qualified function or conversion operator). If CString
doesn't provide any of these, then you can't safely copy a volatile
object of that type.