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、次のエラーが発生します。

エラーC4716:'DI_1 :: operator =':値を返す必要があります

DI_2一方、クラスでも同じエラーが返されることを期待していました。

DI_2これは、クラスにエラーとしてフラグを立てないコンパイラのバグですか?

そうでない場合、誰かが理由を説明できますか?

編集:Solarisコンパイラで確認しましたが、両方のクラスでエラーがスローされます。

4

1 に答える 1

0

バイナリ モジュールからクラスをエクスポートしても、違いはありません。あなたの例では、意味的な違いも見られません。

それにもかかわらず、間違ったコード生成ではなく、比類のない少ない問題での悪いエラー報告。すべての合理的なコンパイラ開発者は、この規則に従います。これが説明です。

ps テンプレートのインスタンス化中に、呼び出されたメソッドのみが生成されます。他のメソッド (およびそれらの潜在的な構文エラー) は無視されます。それどころか、クラスのAFAIKでは、通常、すべてのメソッドが生成されます。この非対称性の正当な理由はわかりません。おそらく、MS コンパイラはこの方向で何かを行っているのでしょう。

于 2012-09-29T09:33:51.657 に答える