С точки зрения квалификации, все в порядке. С каждым выражением, разделенным на утверждение:
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, но технически это не так (то есть комитет упустил это из виду).