Это не неопределенно.Это именно то, для чего const_cast
.Пока сам объект не является const
, вы можете отбросить его с помощью const_cast
и делать с ним те же вещи, что и с указателем не const
.
Обратите внимание, что const_cast
обычно считается запахом кода и может указывать на плохой дизайн.
Как гласит стандарт :
В теле не static
([class.mfct]) функция-член, ключевое слово this
- это значение, значение которого является указателем на объект, для которого вызывается функция.Тип этого в функции-члене класса X
: X*
.Если функция-член объявлена как const, типом этого является const X*
, если функция-член объявлена volatile
, типом этого является volatile X*
, а если функция-член объявлена const volatile
, типэто const volatile X*
.
Тип this
в вашем случае const X*
, даже если сам объект не является const
.
Стандарт говорит об этом о const_cast
:
Для двух похожих типов T1
и T2
значение типа T1
может быть явно преобразовано в типT2
с использованием const_cast
.Результат const_cast
относится к исходной сущности.
Таким образом, приведение от const X*
к X*
также допустимо.
Наконец, он говорит (хотя и в примечании):
[Примечание: в зависимости от типа объекта, операция записи через указатель, lvalue или указатель на элемент данных, получаемый в результате const_castто, что отбрасывает const
-квалификатор, может привести к неопределенному поведению ([dcl.type.cv]).- конец примечания]
И [dcl.type.cv]
сообщает нам :
Любая попытка изменить ([expr.ass], [expr.post.incr], [expr.pre.incr]) объект const ([basic.type.qualifier]) в течение его времени жизни ([basic.life]) приводит к неопределенному поведению.
К счастью,наш this
указывает на объект, не являющийся const
, поэтому приведение его и последующая модификация этого объекта с помощью нового указателя, не являющегося const
, не вызывает неопределенное поведение.
Извините, Angew.