标准布局结构体联合中的未定义行为问题咨询
关于union在constexpr中访问非活跃成员的疑问
先看这段代码:
union vec { struct { float x, y, z; }; float data[3]; constexpr vec() : data{} {} }; constexpr vec make_vec(float x, float y, float z) { vec res; res.data[0] = x; res.data[1] = y; res.z = z; return res; } int main() { constexpr vec out = make_vec(0, 1, 2); std::cout << out.z << '\n'; }
我用constexpr来检测代码是否存在未定义行为——因为在constexpr上下文中,未定义行为会直接触发编译错误。
根据C++标准§9.2/19条款:
如果一个标准布局union包含两个或更多共享共同初始序列的标准布局struct,且该union对象当前存储的是这些struct中的一个,那么允许检查其中任意一个的共同初始部分。
基于这条规则,我认为上述代码应该是定义行为,但用g++ main.cpp -o out -std=c++17编译时,却出现错误:
error: change of the active member of a union from 'vec::data' to 'vec::<anonymous>'
我尝试把代码改成以下形式,确保两个成员都是标准布局struct:
union vec { struct { float x, y, z; }; struct { float data[3]; }; constexpr vec() : data{} {} };
但修改后仍然报相同的错误。
请问这真的是未定义行为吗?是不是我遗漏了某些标准条款,或是对现有条款的解读有误?
内容的提问来源于stack exchange,提问作者Jcsq6
相关产品推荐
相关产品推荐

