小编Den*_*son的帖子

这是 C++ 中未定义的行为吗?

此示例是从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 之后才被明确定义。

c++ strict-aliasing language-lawyer c++20

6
推荐指数
1
解决办法
310
查看次数

标签 统计

c++ ×1

c++20 ×1

language-lawyer ×1

strict-aliasing ×1