2011-09-22 62 views
3

我不是在問這種調用的邏輯,而是我對支持B/W Visual C++和GCC/Clang的區別感興趣。 Visual C++將不允許將對象的新實例用作其自己的拷貝構造函數的參數。 GCC和Clang允許這樣做。考慮到'int i = i''是允許的,我想知道是否Visual C++有一個錯誤。正在創建實例調用複製構造函數

class test { 
private: 
    test() {} 
public: 
    test(const test& t) {} 
}; 

int main(void) { 
    int i = i; 
    test t(t); -- this line gives an error in Visual C++ 
    return 0; 
} 
+2

那麼在GCC中,雞還是雞蛋先來? – Jon

+0

'int i = i'和'test t(t)'是相當不同的形式。後者非常明顯無效(實際上,前者應該也是如此)。 – ssube

+1

int i = i是一個賦值,沒有複製構造在那裏吸引.. – stijn

回答

2

引述C++標準(3.3.2):

一個名字的點聲明的立即是其完整的說明符後,其初始化

在你的面前第一個聲明,聲明符在int i之後結束,因此在初始化程序(= i)中使用名稱i,因此聲明是格式良好的,但其行爲我沒有定義。

在第二條語句中,聲明符在test t(t)之後結束,並且沒有初始化程序;名稱t而不是可用於您使用它的位置,因此該聲明不合格。

所以編譯器的行爲是正確的。我希望它可以被配置爲對第一個陳述給出警告,但不要求拒絕它;就像你說的那樣,它需要拒絕第二個。

0
test t(t); -- this line gives an error in Visual C++ 

你上哪兒去定義T'編譯器不是物理的!

+2

你的意思是「心理」。 – Puppy

+0

只有perl可以忽略物理。 – ssube