Это const_cast неопределенное поведение? - PullRequest
8 голосов
/ 11 мая 2011

Мне было интересно, является ли следующее неопределенным поведением

// Case 1:
int *p = 0;
int const *q = *const_cast<int const* const*>(&p);

// Case 2: (I think this is the same)
int *p = 0;
int const *const *pp = &p;
int const *q = *pp;

Является ли это неопределенным поведением при чтении int*, как если бы оно было int const*? Я думаю, что это неопределенное поведение, но ранее я думал, что только добавление const в целом безопасно, поэтому я не уверен.

1 Ответ

5 голосов
/ 12 мая 2011

С точки зрения квалификации, все в порядке. С каждым выражением, разделенным на утверждение:

int *p = 0; // ok
int **addrp = &p; // ok
int const *const *caddrq = addrp; // ok, qualification conv. according to §4.4/4
int const *q = *caddrq; // ok

Обратите внимание, что правила const_cast (§5.2.11 / 3) идентичны правилам преобразования квалификации, но без требования монотонного повышения квалификации. В вашем случае, поскольку вы только добавляете квалификации, const_cast не требуется.


Что касается псевдонимов, я не думаю, что это проблема, здесь, или, по крайней мере, она не предназначена.

Как вы упомянули, в списке разрешенных методов доступа C ++ 0x есть новый маркер (§3.10), который допускает схожие типы («схожие» - это типы, возникающие из квалификационных преобразований). В C ++ 03 этого маркера нет, но я подозреваю, что в нем говорится о разрешении более квалифицированного доступа cv, но технически это не так (то есть комитет упустил это из виду).

...