为什么union不允许其元素具有用户定义的构造函数?

时间:2012-06-20 11:07:04

标签: c++ visual-c++ unions c++03

当第一个struct有构造函数时,如何使第二个struct工作? 我收到错误:

error C2620: member 'test::teststruct::pos' of union 'test::teststruct::<unnamed-tag>' has user-defined constructor or non-trivial default constructor

代码:

struct xyz {
    Uint8 x, y, z, w;
    xyz(Uint8 x, Uint8 y, Uint8 z) : x(x), y(y), z(z) {}
};
struct teststruct {
    union {
        Uint32 value;
        xyz pos; // error at this line.
    };
};

我可以使用一个函数来初始化xyz结构,但它不会慢得多吗?更不用说:我有大量的结构我需要用init_xyz()等前缀创建自己的函数,这是不好的。有没有其他办法解决这个问题?

2 个答案:

答案 0 :(得分:5)

可能要避免这种情况:

struct A {
    Uint8 a;
    A() : a(111) {}
};

struct B {
    Uint8 b;
    B() : b(2222) {}
};

struct teststruct {
    union {
        A aValue;
        B bValue;
    };
};

应该发生什么,A和B构造函数都会尝试以不同的方式初始化相同的内存。

可能更容易说用户定义的构造函数,而不是让某些规则说明哪些会获胜

答案 1 :(得分:1)

来自C ++ 03,9.5 Unions,第162页

union可以具有成员函数(包括构造函数和析构函数),但不具有虚函数(10.3)。工会不得有基类。联合不应该用作基类。具有非平凡构造函数(12.1)的类的对象,非平凡的复制构造函数(12.8),非平凡的析构函数(12.4)或非平凡的复制赋值运算符(13.5.3,12.8)不能是联合的成员,也不能是这类对象的数组