2010-10-29 85 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