以下代码使用 g++ 4.4.5 编译良好,但使用 g++ 4.5.3 报告错误。是编译器行为发生了变化吗?如果是这样,发生了什么变化?
#include <iostream>
using namespace std;
class A
{
public:
A() {}
};
int main()
{
new A::A();
return 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;
}
好吧,显然编译器的行为已经改变,因为你有一个以前没有的错误。
问题是,对构造函数的调用不应被限定(即,以类型开头)。似乎 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 会在没有警告的情况下接受代码。
虽然 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