在C++

2012-02-11 70 views
4

圓括號未命名臨時變量考慮下面的代碼:在C++

struct Foo 
{ 
}; 

struct Bar 
{ 
    explicit Bar(const Foo&) 
    { 
    } 
}; 

int main() 
{ 
    Foo foo; 

    Bar bar(foo); // Okay. 
    Bar(foo);  // Will not compile. 
    (Bar(foo)); // Okay. Unnamed temporary requires parenthesis. 
} 

爲什麼周圍的臨時版本括號需要?他們解決了什麼模棱兩可的問題?

我的預感是:我認爲編譯器看到Bar(foo)作爲函數的聲明,但我不確定爲什麼會這樣,因爲foo(實例)不是一個類型。因此,括號強制將上述內容視爲表達式,而不是前向聲明。

回答

5

祝賀您發現了most vexing parse

斯科特邁爾斯形容如下:

在一般情況下,[C++]語言(感謝,不幸的是,它的歷史)會試圖解釋這樣做的函數的聲明任何聲明。

在你的情況下,引入括號可以消除解析的歧義,迫使它成爲本地的。

+0

有趣。謝謝! – Forge95 2012-02-11 02:18:29