2013-04-11 57 views
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; 
} 
+4

你介意與我們分享錯誤嗎? – 2013-04-11 13:34:17

+1

爲什麼'new A :: A()'而不僅僅是'new A()'? – david 2013-04-11 13:34:58

+0

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

回答

2

很明顯,編譯器行爲已經改變,因爲你有一個錯誤,你以前沒有過。

事情是,對構造函數的調用不應該被限定(即在類型前面)。 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,通常是嚴格的,接受代碼沒有警告。

+0

任何想法,當它發生變化?它在gcc發行說明中提到過嗎?任何參考將有幫助 – user2270465 2013-04-11 13:41:26

+0

@ user2270465:對不起,它似乎沒有提及;有趣的是,似乎Clang 3.2在沒有警告的情況下接受代碼......並且似乎明確允許在C++ 11中使用§5.5.1/ 8 [...] *其中使用了class-name :: class-name,並且兩個類名引用同一個類,這個表示法命名一個構造函數(12.1)。* – 2013-04-11 13:56:13

0

儘管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