2014-10-28 152 views
-1
#include <fstream> 
#include <iostream> 

class Bar { }; 

class Foo { 
    public: 
    Foo(Bar&) { } 
}; 

int main() 
{ 
    Foo bar(Bar()); 
} 

Bar()返回什麼?爲什麼這個代碼會編譯?將構造函數的返回值作爲參數傳遞

+0

「爲什麼要編譯?」改變'main'爲'Foo bar((Bar()));'看到你想要的行爲代碼不能編譯:-) – dasblinkenlight 2014-10-28 22:35:54

回答

1

它實際上並不重要什麼Bar()返回,因爲它實際上什麼都不做!聲明

​​

是一個函數聲明,宣佈它返回一個Foo和接受一個函數採取任何參數,並返回一個Bar作爲參數的函數bar。這種聲明被稱爲Most Vexing Parse

假設語句被寫成如

Foo bar{Bar()}; 

表達Bar()將通過調用Bar的默認構造函數創建Bar類型的臨時對象。當然,代碼不會編譯,因爲您不能將由Bar()生成的臨時文件綁定到const左值引用,這是Foo的構造函數所期望的。

+0

我用Foo bar {Bar( )};在Visual Studio 2014中,它編譯得很好。這是視覺工作室的錯? – 2014-10-28 23:18:32

相關問題