union可以用用户定义构造函数包含类的对象吗?当我尝试创建它时会给出一个错误,说“union'c'的成员'c :: aa'具有用户定义的构造函数或非平凡的默认构造函数” 它是标准还是我的代码中有任何错误?
我测试的代码是
class a
{
public:
int aaa;
a(){}
};
class b
{
public :
long bbb;
b() { }
};
union c
{
public :
c() {}
a aa;
b bb;
};
答案 0 :(得分:2)
这是可能的,因为C ++ 11(“无约束的工会”)。
答案 1 :(得分:2)
在C ++ 11之前,答案是“否” - union
只能包含值类型(从托管代码中借用一个术语),即只包含数据成员的类型。
Union
分享所有成员的记忆足迹。在联合中具有复杂成员将导致这样的情况:作用于一个类的数据成员的方法将破坏联合中另一个类的数据成员。
也许你想要的是struct
。
答案 2 :(得分:1)
class a
{
public:
int aaa;
a(){}
};
class b
{
public :
long bbb;
b() { }
};
union c
{
public :
c() {}
a aa;
b bb;
};
int main()
{
return 0;
}
使用以下在线编译器,上述代码运行良好。 http://www.compileonline.com/compile_cpp11_online.php
所以答案是肯定的,不是,取决于您的编译器。 MS VS 2010不编译该代码,因为它还不完全是C ++ 11。显然,最新的C ++ 11 GCC编译器可以很好地编译它!这在我看来很棒,因为所有沿着简单的用户定义的构造函数只是初始化数据并且它不会改变内存布局。
C ++ 03标准规定任何具有用户定义构造函数的类或结构都是非POD。 Bjarn Stroustrup在他的主页上写了一些内容,指出POD与非POD的定义过于严格,因为用户定义的函数并不总是导致非平凡的内存布局。这就是放宽规则的原因。