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 Compiler 确认,它对两个类都抛出错误。

4

1 回答 1

0

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

尽管如此,糟糕的错误报告在无可比拟的更少问题中,而不是错误的代码生成。每个合理的编译器开发者都会遵循这个规则。这就是解释。

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

于 2012-09-29T09:33:51.657 回答