我想知道是否允许 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
上面的例子。)