Ответ 1
Нет, они не могут быть разными. Для достаточно разных T1
и T2
, sizeof(T1 *)
может отличаться от sizeof(T2 *)
, но если T2
является просто const T1
, то:
3.9.2 Типы соединений [basic.compound]
3 [...] Указатели на cv-квалификационные и cv-неквалифицированные версии (3.9.3) совместимых с макетами типов должны иметь одинаковые требования к представлению и выравниванию значений (3.11). [...]
И любой тип T
совместим с макетами с самим собой:
3.9 Типы [basic.types]
11 Если два типа
T1
иT2
являются одним и тем же типом, тоT1
иT2
являются совместимыми с макетами типами. [...]
Представление значения относится к представлению объекта, вы не можете иметь такое же представление значения, не имея того же представления объекта. Последнее означает, что требуется такое же количество бит.
3.9 Типы [basic.types]
4 Объектным представлением объекта типа
T
является последовательность Nunsigned char
объектов, занятых объектом типаT
, где N равноsizeof(T)
. Представление значения объекта представляет собой набор битов, которые содержат значение типаT
. Для тривиально копируемых типов представление значений представляет собой набор бит в представлении объекта, который определяет значение, которое является одним дискретным элементом определенного набора значений. 4444). Предполагается, что модель памяти С++ совместима с моделью языка программирования ISO/IEC 9899.
Точка требования, причина в том, что она не просто говорит о том, что два типа имеют одно и то же представление объекта, состоит в том, что T *
и const T *
имеют не только одинаковое количество бит, но также те же биты в T *
и const T *
, которые составляют значение. Это должно гарантировать не только это sizeof(T *) == sizeof(const T *)
, но это означает, что вы можете использовать memcpy
для копирования значения указателя T *
в значение указателя const T *
или наоборот и получить осмысленный результат, то же самое результат получится с помощью const_cast
.
Требования к выравниванию также дают некоторые дополнительные гарантии, но они сложны для объяснения должным образом и не имеют прямого отношения к этому вопросу, и в стандарте есть проблемы, которые подрывают некоторые из предполагаемых гарантий, поэтому я считаю, что лучше всего игнорировать здесь.