此示例是从cppreference复制的。
struct Y { int z; };
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
const int g = q->z; // OK
const int h = std::launder(reinterpret_cast<Y*>(&s))->z; // OK
Run Code Online (Sandbox Code Playgroud)
我想知道像s[0] = std::byte{0}
上面的语句之后添加操作是否是未定义的行为?看起来它并没有违反严格的别名规则,因为std::byte
根据cppreference可以是任何类型的“AliasedType” ,这意味着将任何对象视为字节数组是合法的。
请注意,我添加了 c++20 标签,因为它们可能只有在 C++20 之后才被明确定义。