2012-09-29 59 views
2
class __declspec(dllexport) DI_1 
{ 
    DI_1& operator = (DI_1 &){}; 
}; 

class DI_2 
{ 
    DI_2& operator = (DI_2 &){}; 
}; 

int main() 
{ 
    DI_1 a; 
    DI_2 b; 
    return 0; 
} 

VS 2010/2012編譯下面的代碼提供了以下錯誤:導出課程有什麼不同?

error C4716: 'DI_1::operator=' : must return a value

,而我期待它返回相同的錯誤爲DI_2類也。

這是一個編譯器bug沒有標記DI_2類也是一個錯誤?

如果不是,有人可以解釋原因嗎?

編輯︰ 我確認與Solaris編譯器,它會引發這兩個類的錯誤。

+0

一旦您嘗試調用b的'operator =',就會引發錯誤。但是,從技術上講,它只是一個編譯器警告(它會自動提升爲錯誤)。沒有回報是未定義的行爲。也許dllexport強加更嚴格的規則。 – s3rius

+0

聞起來像一個bug,發佈到connect.microsoft.com –

回答

0

從二進制模塊導出類應該沒有任何區別。在你的例子中,我也沒有看到任何語義差異。

儘管如此,糟糕的錯誤報告無法彌補較少的問題,而不是錯誤的代碼生成。每個合理的編譯器開發者都將遵循這個規則這是解釋。

p.s.在模板實例化期間,僅生成那些被調用的方法。其他方法(及其中的潛在語法錯誤)將被忽略。相反,對於AFAIK類,通常會生成所有方法。我不知道這種不對稱的充分理由。也許MS編譯器正在朝這個方向努力。