0

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

#include <iostream>
using namespace std;

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

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

2 回答 2

2

好吧,显然编译器的行为已经改变,因为你有一个以前没有的错误。

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

编辑:

我似乎记得这在 C++98 中是被禁止的(但每个人都让它滑动)。然而,C++11 标准至少在某些地方明确接受它(参见 §5.5.1/8)。很可能是在 gcc 中改进对 C++11 的支持时引入了一个错误,或者相反,现在它只允许在 C++11 标准接受的那些地方;至少 gcc 4.8.0仍然拒绝该代码

奇怪的是,通常严格的 Clang 3.2 会在没有警告的情况下接受代码。

于 2013-04-11T13:38:10.117 回答
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
于 2013-04-12T10:40:30.650 回答