1

C++11 被介绍给我的是:

C++11 引入了几个新的方便的类型推断功能,这意味着您可以减少编写编译器已经知道的东西的时间

问题:为什么编译器对以下两个错误有不同的行为?在这种简单的情况下,这不是很挑衅吗?

class Foo{};
class Bar{};
int main()
{
    Foo foo;
    auto foo = Foo();       // <- error C2086: 'Foo foo' : redefinition
    ////////////
    Bar* boo = new Bar();
    auto boo = new Bar();   // <- error C2040: 'boo' : 'auto' differs in levels of indirection from 'Bar *'

    return 0;
}

PS:我忘了告诉我的编译器:这是VS2012

4

2 回答 2

1

在第一种情况下,错误是重新定义了相同类型的对象。编译器报告说,重新定义是非法的。

每个定义也是一个声明。显然,编译器发现您的第二个定义是名称的声明,boo但该声明实际上与第一个不同,编译器会报告此错误。它可能永远无法确定不正确的声明也恰好是定义,因此也存在重新定义。

如果代码存在多个问题,您期望编译器报告相同的错误有点不相关,因为可能会创建一个使用需要产生多个不同错误的示例。

于 2015-01-10T20:25:05.370 回答
0

这看起来像是编译器的错误报告代码中的一个错误。

我第一次重新定义得到的错误消息auto foo = Foo();error C2371: 'foo': redefinition; different basic types,这是错误的:两者的类型foo是相同的。

第二次重新定义的错误信息也是错误的,只是不同的错误。

因此,这只是另一个微软的错误。

于 2015-01-10T20:28:20.993 回答