你能用 std::aligned_union 违反严格的别名规则吗
Can you violate the strict aliasing rule with std::aligned_union
联合规则,例如 [class.mem]
p20 是否也允许 std::aligned_union_t
?例如,如果我将两对(pair<const A, B>
和 pair<A, B>
)存储在 std::aligned_union_t
中,并且非 const 对始终处于活动状态。访问 pair<const A>
类型是否违反了严格的别名规则?
标准似乎在 [class.mem]
p20 中暗示即使在非 const 对处于活动状态时访问该对的 const 成员也是安全的
union U {
std::pair<A, B> pair;
std::pair<const A, const B> const_pair;
};
U u = {A{}, B{}};
cout << u.const_pair.first << endl;
cout << u.const_pair.second << endl;
但是对于 std::aligned_union
和放置 new
和 reinterpret_cast
构造并获得正确值是否同样安全?
(假设A
和B
是标准布局)
当核心语言说"union"时,意思是"union",即"a class defined with the class-key union
"。不是被称为 aligned_union_t
.
的可悲的图书馆模仿
联合规则,例如 [class.mem]
p20 是否也允许 std::aligned_union_t
?例如,如果我将两对(pair<const A, B>
和 pair<A, B>
)存储在 std::aligned_union_t
中,并且非 const 对始终处于活动状态。访问 pair<const A>
类型是否违反了严格的别名规则?
标准似乎在 [class.mem]
p20 中暗示即使在非 const 对处于活动状态时访问该对的 const 成员也是安全的
union U {
std::pair<A, B> pair;
std::pair<const A, const B> const_pair;
};
U u = {A{}, B{}};
cout << u.const_pair.first << endl;
cout << u.const_pair.second << endl;
但是对于 std::aligned_union
和放置 new
和 reinterpret_cast
构造并获得正确值是否同样安全?
(假设A
和B
是标准布局)
当核心语言说"union"时,意思是"union",即"a class defined with the class-key union
"。不是被称为 aligned_union_t
.