"重新定义"错误更改为"间接级别不同"当使用`auto`关键字时

时间:2015-01-10 20:12:19

标签: c++ c++11 visual-c++-2012

C ++ 11已被介绍给我:

  

C ++ 11引入了一些新的handy-dandy类型推断功能   这意味着你可以花更少的时间来写出来的东西   编译器已经知道了

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

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

2 个答案:

答案 0 :(得分:1)

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

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

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

答案 1 :(得分:0)

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

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

第二次重新定义的错误消息也是错误的,只是区别错误。

所以只是另一个MicroSoft翘起来。