新版gcc中的编译器错误

时间:2013-04-11 13:33:27

标签: c++

以下代码使用g ++ 4.4.5编译好,但报告错误与g ++ 4.5.3。是编译器行为已更改。如果是这样,会发生什么变化?

#include <iostream>
using namespace std;

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

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

2 个答案:

答案 0 :(得分:2)

嗯,显然编译器行为已经改变了,因为你之前没有错误。

问题是,对构造函数的调用不应该是合格的(即,以类型开头)。似乎gcc 4.5.3过去忽略了这个问题,而4.5.5在执行标准方面更为严格。

修改

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

奇怪的是,Clang 3.2一般都是严格的,在没有警告的情况下接受代码。

答案 1 :(得分:0)

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

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