联合体成员初始化列表中初始化多个重叠字段是否合法?

6

我有这个联合体:

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)

它确实关闭了工具,但看起来非常可疑。(根据评论编辑:GCC和Clang不接受它,因此“非常可疑”似乎是合理的。)
对于结构体,成员初始化器按照在结构体中定义的顺序执行。是否有类似的东西用于联合体,以确保由于u32(0)而不会被归零?
我们没有太多关于可移植性的意图。目前,该项目针对Windows系统,但将来可能面向iOS和Android。我可以几乎保证它不会出现在奇怪和神秘的平台上。
当然,我可以在构造函数体中设置a、b、c和d,这样就避开了整个问题(或者我可以禁用警告),但这让我很好奇。

不是答案,但是有没有指令(类似于pragma之类的)可以让该工具知道在这种特定情况下是可以的? - Amit
@Amit,我没有为这个特定问题的解决方法短缺。:) 有一个,是的。 - zneak
@PcAF,Clang-3.8接受它 - zneak
1
匿名结构体不是标准的C++。因此,语言专家的答案是“这是不合法的,编译器在发出诊断后可以做任何它想做的事情”。 - T.C.
显示剩余4条评论
1个回答

5

N4594

12.6.2/§? (根据 §9):

[ 注意: [...] —注释 ] 试图初始化联合体的一个以上非静态数据成员将使程序不符合规范。 [ 注意: [...] —注释 ]


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接