2013-04-11 78 views
0

以下代码用g ++ 4.4.5编译得很好,但用g ++ 4.5.3报告错误。编译器行为是否发生了变化?如果是这样,有什么变化?在较新的gcc版本中编译错误

#include <iostream> 
using namespace std; 

class A 
{ 
    public: 
     A() {} 
}; 

int main() 
{ 
    new A::A(); 
    return 0; 
} 
+4

你介意与我们分享错误吗? – 2013-04-11 13:34:17

+1

为什么'new A :: A()'而不仅仅是'new A()'? – david 2013-04-11 13:34:58

+0

test.cpp:在函数'int main()'中: test.cpp:12:7:error:expected type-specifier test.cpp:12:7:error:expected';' – user2270465 2013-04-11 13:34:59

回答

2

很明显,编译器行为已经改变,因为你有一个错误,你以前没有过。

事情是,对构造函数的调用不应该被限定(即在类型前面)。 gcc 4.5.3似乎忽略了这个问题,而4.5.5在执行该标准时更为严格。

编辑:

我似乎记得这是被禁止的(但每个人都让它滑)在C++ 98。但是C++ 11标准明确地接受它,至少在某些地方(见§5.5.1/ 8)。当改进对gcc中C++ 11的支持时,或者恰恰相反,现在只允许在C++ 11 Standard接受的那些地方中引入bug,至少gcc 4.8.0 still rejects the code

奇怪的是,铿锵3.2,通常是严格的,接受代码没有警告。

+0

任何想法,当它发生变化?它在gcc发行说明中提到过吗?任何参考将有帮助 – user2270465 2013-04-11 13:41:26

+0

@ user2270465:对不起,它似乎没有提及;有趣的是,似乎Clang 3.2在没有警告的情况下接受代码......并且似乎明确允许在C++ 11中使用§5.5.1/ 8 [...] *其中使用了class-name :: class-name,并且两个类名引用同一个类,这个表示法命名一个构造函数(12.1)。* – 2013-04-11 13:56:13

0

尽管class-name :: class-name表示法被定义为构造函数,它不是一个type-id。 在C++ 11 [5.3.1]的[expr.new]定义中指定的新的的要求。

new-expression: 
    ::optnew new-placementopt **new-type-id** new-initializeropt 
    ::optnew new-placementopt(**type-id**) new-initializeropt