2010-10-29 42 views
4

当下列错误出现时,我正在编译下面的代码。我无法找到原因。错误:工会中不允许复制赋值运算符

typedef union { 
    struct { 
    const int j; 
    } tag; 
} X; 


int main(){ 
    return 0; 
} 
error: member `<`anonymous union>::`<`anonymous struct> `<`anonymous union>::tag with copy assignment operator not allowed in union 

此代码编译罚款与海湾合作委员会虽然。仅用g ++给出错误。

回答

6

为了让某个类类型的联合成员TT的特殊成员函数(缺省构造函数,复制构造函数,复制赋值运算符和析构函数)必须是微不足道的。也就是说,它们必须是编译器隐式声明和定义的那些。

您的未命名结构没有一个简单的复制赋值运算符(实际上,它根本没有一个),因为它具有const限定的成员变量,这会抑制生成隐式声明的复制赋值运算符。

2

编译器试图为union本身生成一个赋值运算符,并且因为如果不知道union的活动字段而失败,因此它会回退到该对象的按位副本。但是,它也不能这样做,因为struct { const int j; }有一个不重要的赋值运算符。

参见http://gcc.gnu.org/ml/gcc-help/2008-03/msg00051.html