const_cast
действует на указатели и ссылки, чтобы удалить квалификаторы const
и volatile
.Не имеет смысла использовать его для приведения к типу объекта, так как тогда вы бы сделали копию, которая в любом случае не должна иметь те же cv-квалификаторы, что и оригинал.
Ваш второй пример будет скомпилирован, если выприведение к энергонезависимой ссылке :
volatile CString b0;
CString & b1 = const_cast<CString &>(b0);
Однако использование этой ссылки дает неопределенное поведение, поскольку базовый объект сам по себе volatile
.Вы должны использовать const_cast
для удаления квалификаций только тогда, когда вы знаете , что базовый объект не имеет этих квалификаций (или в случае удаления const
, когда вы знаете , чторезультат не будет использоваться для изменения объекта).
Вы можете получить копию, только если объект позволяет копировать изменяемые объекты (возможно, с помощью конструктора копирования, принимающего ссылку на volatile или квалифицированную volatile).функция или оператор преобразования).Если CString
не предоставляет ничего из этого, вы не можете безопасно скопировать объект volatile
этого типа.