Почему const_cast прочь volatile работает только для указателя - PullRequest
2 голосов
/ 18 ноября 2011
// 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 ]

9 голосов
/ 18 ноября 2011

const_cast действует на указатели и ссылки, чтобы удалить квалификаторы const и volatile.Не имеет смысла использовать его для приведения к типу объекта, так как тогда вы бы сделали копию, которая в любом случае не должна иметь те же cv-квалификаторы, что и оригинал.

Ваш второй пример будет скомпилирован, если выприведение к энергонезависимой ссылке :

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

Однако использование этой ссылки дает неопределенное поведение, поскольку базовый объект сам по себе volatile.Вы должны использовать const_cast для удаления квалификаций только тогда, когда вы знаете , что базовый объект не имеет этих квалификаций (или в случае удаления const, когда вы знаете , чторезультат не будет использоваться для изменения объекта).

Вы можете получить копию, только если объект позволяет копировать изменяемые объекты (возможно, с помощью конструктора копирования, принимающего ссылку на volatile или квалифицированную volatile).функция или оператор преобразования).Если CString не предоставляет ничего из этого, вы не можете безопасно скопировать объект volatile этого типа.

0 голосов
/ 18 ноября 2011

, потому что во втором случае вы на самом деле копируете b0 и не ссылаетесь на исходный объект

вам нужно сделать ссылку в этом случае

const CString &b1 = b0;
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...