出口课程应该有所作为吗?

时间:2012-09-29 07:50:48

标签: c++ visual-studio compiler-bug

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 Compiler中确认,它会为这两个类抛出错误。

1 个答案:

答案 0 :(得分:0)

从二进制模块导出类不应该有任何区别。在您的示例中,我也没有看到任何语义差异。

然而,糟糕的错误报告无可比拟的问题而不是错误的代码生成。每个合理的编译器开发者都将遵循此规则这是解释。

P.S。在模板实例化期间,仅生成那些被调用的方法。其他方法(以及它们中潜在的语法错误)将被忽略。相反,对于AFAIK类,通常会生成所有方法。我不知道这种不对称的充分理由。也许MS编译器正朝这个方向做点什么。