2012-03-25 83 views
1

我想編譯Visual Studio(2008)和g ++中的代碼。
在vs2008中是成功的,但在g ++中報告錯誤。
如果添加const
test(const test &source):a(source.a) {}
G ++編譯會成功。
我知道test aa = 2;會創建一個臨時對象並調用copy-constructor。
臨時對象不能綁定到非const引用
那麼,爲什麼vs2008可以編譯成功呢?約vs/g ++與複製構造函數

class test{ 
public: 
    test():a(1) {} 
    test(int num):a(num) {} 
    test(test &source):a(source.a) {} 
private: 
    int a; 
}; 

int main(){ 
    test aa = 2; 
    return 0; 
} 

回答

3

VS有一個非標準的擴展名,允許它,不幸的是。

有一個編譯器標誌來禁用擴展,但最後我檢查它也使它不可能使用標準庫。最好的辦法是保持警告級別爲4(儘管這種特殊情況沒有任何警告),並儘可能使用多個編譯器檢查彙編。

+0

不幸的是,沒有任何警告。/Za將禁用非標準行爲,但/ Za不推薦使用。 – 2012-03-25 07:39:02

+0

@JamesMcNellis:嗯,你說得對,即使是用'/ Wall'(無論如何它基本上是無法使用的)。它*不會警告'test aa = test(2);',這是它應該產生的東西,但不是別的。 – GManNickG 2012-03-25 07:48:43

+0

@JamesMcNellis:我發現vs不調用copy-constructor,它調用'test(int num)'。 – skeu 2012-03-25 08:11:36