以下代码使用g ++ 4.4.5编译好,但报告错误与g ++ 4.5.3。是编译器行为已更改。如果是这样,会发生什么变化?
#include <iostream>
using namespace std;
class A
{
public:
A() {}
};
int main()
{
new A::A();
return 0;
}
答案 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