以下代碼用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;
}
以下代碼用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;
}
很明顯,編譯器行爲已經改變,因爲你有一個錯誤,你以前沒有過。
事情是,對構造函數的調用不應該被限定(即在類型前面)。 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,通常是嚴格的,接受代碼沒有警告。
任何想法,當它發生變化?它在gcc發行說明中提到過嗎?任何參考將有幫助 – user2270465 2013-04-11 13:41:26
@ user2270465:對不起,它似乎沒有提及;有趣的是,似乎Clang 3.2在沒有警告的情況下接受代碼......並且似乎明確允許在C++ 11中使用§5.5.1/ 8 [...] *其中使用了class-name :: class-name,並且兩個類名引用同一個類,這個表示法命名一個構造函數(12.1)。* – 2013-04-11 13:56:13
儘管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
你介意與我們分享錯誤嗎? – 2013-04-11 13:34:17
爲什麼'new A :: A()'而不僅僅是'new A()'? – david 2013-04-11 13:34:58
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