我想知道是否允许 C++ 实现以不同的方式表示指向不同类型的指针。例如,如果我们有 4-byte sized/alignedint和 8-byte sized/aligned long,是否可以将指向 / 的指针表示int为long分别右移 2/3 位的对象地址?这将有效地禁止将指向指针的指针转换为指向指针long的指针int。
我问是因为[expr.reinterpret.cast/7]:
对象指针可以显式转换为不同类型的对象指针。当
v对象指针类型的纯右值转换为对象指针类型“指向cvT的指针”时,结果为static_cast<cv T*>(static_cast<cv void*>(v)).[注7:将指向类型
T1对象的“pointer to”T1类型的指针转换为“pointer toT2”类型(其中T2是对象类型,对齐要求T2不比的更严格T1)并返回其原始type 产生原始指针值。——尾注]
第一句话表明我们可以将指针转换为任意两种对象类型。然而,(非规范性的)注释 7中的移情文本说,对齐在这里也起到了一定的作用。(这就是我想出这个的原因int——long上面的例子。)