在union的成员初始化列表中初始化多个重叠字段是否合法?

zne*_*eak 6 c++ language-lawyer

我有这个联盟:

union Foo
{
    uint32_t u32;
    struct
    {
        uint32_t a : 10;
        uint32_t b : 10;
        uint32_t c : 10;
        uint32_t d : 2;
    };

    Foo() : a(0), b(1), c(2), d(3)
    {
    }
};
Run Code Online (Sandbox Code Playgroud)

我们有一个工具可以分析C++代码中的潜在错误,并且u32在我写这个时它认为尚未初始化时会出现误报.

我发现VC++会让我写这个成员初始化列表:

Foo() : u32(0), a(0), b(1), c(2), d(3)
Run Code Online (Sandbox Code Playgroud)

它确实关闭了工具,但看起来......非常可疑.(根据评论进行编辑:GCC和Clang不会接受它,因此看起来很可疑.)

对于结构,成员初始值设定项按结构中的定义顺序执行.对于工会是否有类似的东西,以确保这不会因为u32(0)

我们没有很好的可移植性.目前,该项目面向Windows,但未来可能会面向iOS和Android.我几乎可以保证它不会出现在奇怪和异国情调的平台上.

当然,我可以只设置a,b,cd在构造函数的身体,它回避了整个问题(或者我可以禁用警告),但它让我好奇.

PcA*_*cAF 5

N4594

12.6.2 /§?(根据§9):

[注意:[...] -end note] 尝试初始化联合的多个非静态数据成员会导致程序格式错误.[注:[...] - 后注]