以下代码:
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说:
如果两个联盟成员是标准布局类型,那么它可以很好地定义以检查它们在任何编译器上的公共子序列
Bar bar = { Foo() }
当我在Visual Studio 2008中尝试此操作时,我收到错误:
错误C2620:
Bar::fBar
的成员union Bar
具有用户定义的构造函数或非平凡的默认构造函数
union成员不能有默认构造函数。
这里发生了什么?这是否是C ++的要求,我认为标准布局是唯一的要求?有解决方法吗?
答案 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