C++ 联合的成员具有用户定义的构造函数

C++ 联合的成员具有用户定义的构造函数,c++,visual-studio-2008,unions,default-constructor,standard-layout,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++是完全合法的。说: 如果两个union成员是标准布局类型,那么在任何编译器上检查它们的公共子序列都是定义良好的 因此: 在Visual Studio 2008中尝试此操作时,出现以下错

对于以下代码:

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

union Bar{
    Foo fBar;
    double dBar;
};
我相信C++是完全合法的。说:

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

因此:

在Visual Studio 2008中尝试此操作时,出现以下错误:

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

国家:

联合成员不能有默认构造函数


这是怎么回事?这是否是C++的要求,我认为标准布局是唯一的要求?有没有工作围绕这个?

< p>在C++ 98/03中,C++标准中规定了9.5<P/P> […]如果一个POD联合包含多个共享公共初始序列的POD结构(9.2),并且如果此POD联合类型的对象包含一个POD结构,则允许检查任何POD结构成员的公共初始序列;[……]

这在C++11中更改为

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

因此,在C++11之前,您只能在一个联合体中使用POD类型,这意味着MSVS2008给了您正确的错误。为了使用新类型的联合,您需要获得支持该更改的MSV版本。从中我们可以看到,在非限制工会部分中,直到2015年版才进行了更改


您必须将该类升级或更改为VS2008不包含C++11编译器的类。如果您想使用C++11中引入的语言功能,您需要升级。如果您想获得最大程度的C++11一致性,我将使用2015更新3。@CaptainObvlious,这不是C++11功能,错误仍然列在Visual Studio 2013中:@NathanOliver,这不是C++11功能,该错误仍然在Visual Studio 2013中列出:@JonathanMee Unions确实从C++98/03更改为C++11。以前他们只能有吊舱物体。现在它们被扩展了。还要注意的是,MSVS2013仍然缺少C++11特性。看看哪里有不受限制的工会,那么它似乎有错了?所以我在问题中的引用应该包含在C++11块中吗?@JonathanMee看起来是这样的。jist是正确的,但术语发生了变化。
Bar bar = { Foo() }