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