2013-04-24 51 views
1

我有一堆聯合類(union_a,union_b,...),全部使用相同的數據成員和不同的成員函數。 我希望能夠將任何類的對象分配給任何其他類的對象,並且 將它用於任何ctor for init。 「工作」聯合union_z用作中介。 在VC中一切正常。 在GC中,最後一行得到「錯誤:從'union_a'轉換爲非標量類型'union_b'requested」。不同對象類型之間的C++賦值

幫助,如果你能我,我...

union union_z{int m;}; 

union union_a{ 
    int m; 

    union_a(){} 
    union_a(union_z x){m = x.m;} 

    void operator=(union_z x){m = x.m;} 
    operator union_z(){return *(union_z *)this;} 
}; 

union union_b{ 
    int m; 

    union_b(){} 
    union_b(union_z x){m = x.m;} 

    void operator=(union_z x){m = x.m;} 
    operator union_z(){return *(union_z *)this;} 
}; 

union_a a; 
union_b b(a); 
b = a; 
union_b b1 = a; //error: conversion from ‘union_a’ to non-scalar type ‘union_b’ requested 

回答

4

G ++是正確的。複製初始化的正式語法是 將表達式轉換爲=右側的表達式到目標 類型,然後將其複製。在這種情況下,假定從union_aunion_b的隱式 轉換。沒有一個; 唯一的轉換將需要兩個用戶定義的轉換, 和兩個用戶定義的轉換永遠不能用於 內部轉換。

請參閱第8.5/16節和第13.3.1.4節(C++ 11,但涵蓋此 的規則對於早期版本沒有改變)。

+0

兩個*隱式*用戶定義的轉換,對嗎? 'union_b b1 = static_cast (a);'工作。 – jrok 2013-04-24 17:42:14

+0

您可能會添加相關段落:[dcl.init]/17-6-1 – dyp 2013-04-24 17:43:03

+0

@jrok是的。沒有明確的轉換可以成爲隱式轉換的一部分。 – 2013-04-24 17:54:56