为什么匿名联合不能包含具有非平凡构造函数/析构函数的成员?

Sio*_*vok 5 c++ membership unions

我可能弄错了,但我发现的基本解释是联合无法初始化,因为它不知道要调用哪个成员的构造函数.编译器无法自动为union生成构造函数.

为什么不允许用户定义联合构造函数?这将删除所述问题并允许存在具有非平凡构造函数/析构函数的联合成员.

另外,为什么联盟成员不能有任何自定义构造函数?前面的解释不代表自定义构造函数.

更新1:

例:

struct SQuaternion
{
    union
    {
        S3DVector Axis;
        struct
        {
            float X;
            float Y;
            float Z;
        };
    };
    float W;
};
Run Code Online (Sandbox Code Playgroud)

注意:这里的问题似乎是联盟是匿名的.因此,如何命名联盟的构造函数?似乎不可能这样做,仅仅因为它没有名字,没有其他原因.如果这是一个简单的词汇问题,那将是一个可怕的原因......

更新2:只需将有问题的成员包装在一个封闭的匿名结构中,错误就会消失.我想这是一个与匿名联盟最接近的事情.它不再是一个问题的事实似乎仍然很奇怪......

vis*_*tor 13

一个更大的原因是:联盟将如何知道要调用哪个析构函数.语言本身不会跟踪哪个成员在联合中处于活动状态.

似乎C++ 0x将允许联合中的非平凡类型,在这种情况下,您将被迫实现自己的构造函数和析构函数.(后者从提案中有点不清楚,似乎联合析构函数不会调用任何成员析构函数,并且必须手动调用正确析构函数的析构函数.)