-1
#include <fstream>
#include <iostream>
class Bar { };
class Foo {
public:
Foo(Bar&) { }
};
int main()
{
Foo bar(Bar());
}
Bar()返回什麼?爲什麼這個代碼會編譯?將構造函數的返回值作爲參數傳遞
#include <fstream>
#include <iostream>
class Bar { };
class Foo {
public:
Foo(Bar&) { }
};
int main()
{
Foo bar(Bar());
}
Bar()返回什麼?爲什麼這個代碼會編譯?將構造函數的返回值作爲參數傳遞
它實際上並不重要什麼Bar()
返回,因爲它實際上什麼都不做!聲明
是一個函數聲明,宣佈它返回一個Foo
和接受一個函數採取任何參數,並返回一個Bar
作爲參數的函數bar
。這種聲明被稱爲Most Vexing Parse。
假設語句被寫成如
Foo bar{Bar()};
表達Bar()
將通過調用Bar
的默認構造函數創建Bar
類型的臨時對象。當然,代碼不會編譯,因爲您不能將由Bar()
生成的臨時文件綁定到const
左值引用,這是Foo
的構造函數所期望的。
我用Foo bar {Bar( )};在Visual Studio 2014中,它編譯得很好。這是視覺工作室的錯? – 2014-10-28 23:18:32
「爲什麼要編譯?」改變'main'爲'Foo bar((Bar()));'看到你想要的行爲代碼不能編譯:-) – dasblinkenlight 2014-10-28 22:35:54