你能用std :: aligned_union违反严格的别名规则吗?

时间:2018-01-08 22:20:35

标签: c++ c++11 undefined-behavior unions strict-aliasing

联盟的规则,例如[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位置newreinterpret_cast构建并获得正确的值是否同样安全?

(假设AB是标准布局)

1 个答案:

答案 0 :(得分:3)

当核心语言说&#34; union&#34;时,它意味着&#34; union&#34;,即&#34;用 class-key {定义的类{1}}&#34 ;.不是被称为union的可怜的图书馆模仿。