2016-12-06 103 views
1

雖然默認構造好奇心

MyClass m(); 

是一個經典的疑難雜症的,因爲它沒有聲明變量m,而是一個函數取零個參數並且返回MyClass的。然而,我發現,在Visual Studio中的下列語句產生同樣的問題(現在看來,這在某種程度上colapses上面的說法):

MyClass m(MyClass()); 

任何人都可以解釋這種現象?

注意:一個更「明確」的版本可以做正確的事情(即調用默認值,然後是移動構造函數)。

MyClass m(std::move(MyClass())); 

回答

4

這是最讓人頭疼的解析問題。

MyClass m(MyClass()); 

此行被解析像名爲函數返回類型MyClass的的對象,接受一個參數是一個指向函數沒有參數和類型MyClass的的返回值。

這裏:

MyClass m(std::move(MyClass())); 

的std ::移動幫助編譯器解析行預期。

3

是的,這是一個經典的最煩人的解析。看起來像一個函數的所有東西都是一個函數,即使它可能是別的東西。

有幾種傳統的方法轉化爲合適的變量定義這一點,但最好的之一是使用統一的初始化:

MyClass m{MyClass()}; 

(儘管事實上上面的例子是多餘的,和一個更好的例子是當類型不同時,如A m{B()};