鑒于此(粗體部分) about reinterpret_cast,我希望下面的代碼段在強制轉換時會生成不同的地址X*,Y*因為后者比前者更嚴格對齊。我在這里缺少什么?
任何物件指標型別 T1* 都可以轉換為另一個物件指標型別 cv T2*。這完全等同于 static_cast<cv T2*>(static_cast<cv void*>(expression)) (這意味著如果 T2 的對齊要求不比 T1 嚴格,則指標的值不會改變并轉換結果指標回到其原始型別產生原始值)
cppreference/reinterpret_cast
#include <iostream>
struct alignas (1) X
{
char c;
};
struct alignas (32) Y
{
char c;
};
int main(int argc, const char *const* const argv)
{
std::cout << alignof(X) << " " << alignof(Y) << std::endl;
X x;
Y y;
std::cout << &x << " " << reinterpret_cast<Y*>(&x) << std::endl;
std::cout << &y << " " << reinterpret_cast<X*>(&y) << std::endl;
}
輸出
Program returned: 0
1 32
0x7ffef3434578 0x7ffef3434578
0x7ffef3434540 0x7ffef3434540
Godbolt 上的片段
uj5u.com熱心網友回復:
引自[expr.reinterpret.cast]/7:
物件指標可以顯式轉換為不同型別的物件指標。當
v物件指標型別的純右值轉換為物件指標型別“指向 cv 的指標T”時,結果為static_-cast<cv T*>(static_-cast<cv void*>(v))。
然后,從[expr.static.cast]/13:
“指向 cv1 的指標
void”型別的純右值可以轉換為“指向 cv2 的指標T”型別的純右值,其中T是物件型別,而 cv2 與 cv1 具有相同的 cv 限定,或比 cv1 更高的 cv 限定。如果原始指標值表示一個位元組在記憶體中的地址 A 并且 A 不滿足 T 的對齊要求,則結果指標值是未指定的......
我相信這些規則在這里適用。在您的情況下,reinterpret_cast<Y*>(&x)決議為static_cast<Y*>(static_cast<void*>(&x)). 的原始指標值 static_cast<void*>(&x)表示的地址A和該地址通常不滿足的對齊要求Y。因此,結果指標的值是unspecified。
轉載請註明出處,本文鏈接:https://www.uj5u.com/houduan/346454.html
