Да.Это полностью законно.(Это опасно, но это законно.) Если вы (пытаетесь) изменить объект, объявленный как const, поведение не определено.
С n4659 (что является последним черновиком)C ++ 17), раздел 10.1.7.1 [dcl.type.cv], пункт 4:
За исключением того, что любой член класса, объявленный как изменяемый (10.1.1), может быть изменен, любойпопытка изменить объект const во время его жизни (6.8) приводит к неопределенному поведению
Мой акцент.Это из C ++ 17, но это справедливо для всех версий C ++.
Если вы посмотрите на раздел по const_cast
, есть примечание, что
[Примечание. В зависимости от типа объекта операция записи через указатель, lvalue или указатель на элемент данных, полученный в результате const_cast, который отбрасывает const-qualifier76, может привести к неопределенному поведению (10.1.7.1).- конечная заметка]
Примечания не являются нормативными, но это строго подразумевает, что получение неконстантной ссылки или указателя на константный объект является законным.Запрещена запись.