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

时间:2016-07-18 23:35:42

标签: 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)
    {
    }
};

我们有一个工具可以分析C ++代码中的潜在错误,并且在我写这个时它认为u32没有被初始化时会产生误报。

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

Foo() : u32(0), a(0), b(1), c(2), d(3)

它确实关闭了工具,但看起来......非常可疑。 (根据评论编辑:海湾合作委员会和克朗不会接受它,所以看起来非常可疑。)

对于结构,成员初始值设定项按结构中的定义顺序执行。对于工会来说是否有类似的东西可以确保由于u32(0)而没有结果归零?

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

当然,我可以在构造函数体中设置abcd,这可以回避整个问题(或者我可以禁用警告),但它让我很好奇。

1 个答案:

答案 0 :(得分:5)

N4594

12.6.2 /§? (根据§9):

  

[注:[...] -end note] 尝试   初始化一个联合的多个非静态数据成员会导致程序格式不正确。 [注:[...] - 尾注]