Union的成员拥有用户定义的构造函数

时间:2016-10-17 13:55:29

标签: c++ visual-studio-2008 unions default-constructor standard-layout

以下代码:

class Foo{
    int foo;
public:
    Foo() : foo(13) {}
    int getFoo() const { return foo; }
};

union Bar{
    Foo fBar;
    double dBar;
};

我相信这在C ++中是完全合法的。 http://en.cppreference.com/w/cpp/language/union#Explanation说:

  

如果两个联盟成员是标准布局类型,那么它可以很好地定义以检查它们在任何编译器上的公共子序列

因此in gcc I can do this

Bar bar = { Foo() }

当我在Visual Studio 2008中尝试此操作时,我收到错误:

  

错误C2620:Bar::fBar的成员union Bar具有用户定义的构造函数或非平凡的默认构造函数

Error C2620州:

  

union成员不能有默认构造函数。

这里发生了什么?这是否是C ++的要求,我认为标准布局是唯一的要求?有解决方法吗?

1 个答案:

答案 0 :(得分:2)

在C ++ 98/03中,C ++标准在9.5中说明

  

[...]如果POD-union包含多个共享一个公共初始序列的POD结构(9.2),并且该POD-union类型的对象包含一个POD结构,则允许检查任何POD结构成员的共同初始序列; [...]

这在C ++ 11中改为

  

[...]如果标准布局联合包含多个共享公共初始序列(9.2)的标准布局结构,并且此标准布局联合类型的对象包含其中一个标准布局结构,允许检查任何标准布局结构成员的公共初始序列; [...]

因此,在C ++ 11之前,你只能在联合中使用POD类型,这意味着MSVS 2008会给你正确的错误。要使用新类型的联合,您需要获取支持该更改的MSVS版本。从this MSDN article开始,我们可以在 Unrestricted union 部分下看到,在2015版之前未进行此更改。

您将要升级或将班级更改为POD type