我有这个联盟:
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。我几乎可以保证它不会出现在奇怪和异国情调的平台上。
当然,我可以在构造函数体中设置a
,b
,c
和d
,这可以回避整个问题(或者我可以禁用警告),但它让我很好奇。
答案 0 :(得分:5)
N4594
12.6.2 /§? (根据§9):
[注:[...] -end note] 尝试 初始化一个联合的多个非静态数据成员会导致程序格式不正确。 [注:[...] - 尾注]