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
答案 0 :(得分:1)
在第一种情况下,错误是重新定义了相同类型的对象。重新定义是非法的,编译器报告说。
每个定义也是一个声明。显然,编译器发现您的第二个定义是名称boo
的声明,但声明实际上与第一个不同,编译器报告此错误。它可能永远无法确定错误的声明也恰好是定义,因此也有重新定义。
如果代码存在多个问题,您希望编译器报告相同的错误,这有点不可能,因为可能会创建一个示例,其中一个用户需要产生多个不同的错误。
答案 1 :(得分:0)
这看起来像编译器的错误报告代码中的错误。
我为第一次重新定义auto foo = Foo();
收到的错误消息是error C2371: 'foo': redefinition; different basic types
,这是错误的:foo
的类型都是相同的。
第二次重新定义的错误消息也是错误的,只是区别错误。
所以只是另一个MicroSoft翘起来。