You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

标准布局结构体联合中的未定义行为问题咨询

关于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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.16 08:10:21