这是我不理解的示例部分:
struct Y
{
int z;
};
int main()
{
alignas(Y) std::byte s[sizeof(Y)];
Y *q = new (&s) Y{2};
const int f = reinterpret_cast<Y *>(&s)->z; // Class member access is undefined behavior:
// reinterpret_cast<Y*>(&s) has value "pointer to s"
// and does not point to a Y object
}
整个示例在https://en.cppreference.com/w/cpp/utility/launder。
我不明白为什么使用reinterpret_cast<Y *>(&s)->z
是未定义行为。我们已经在所谓的“指向s的指针”处构造了一个Y对象,并将其重新解释为Y*
,那么为什么它仍然说“它没有指向Y对象”?
reinterpret_cast<Y *>(&s)
的值都相同。 - xxhxxreinterpret_cast<Y *>(&s)
的值都相同。但这与确定某些内容是否UB无关。如果标准规定它是UB,编译器可以假设您不会这样做,并且可以生成任何代码。实际上,任何行为都是可以接受的。 - Jesper Juhl