2014-11-14 81 views
0

一個奇怪的C++編譯器行爲今天讓我大吃一驚。C++對象創建或函數原型聲明

class Foo { 
    friend ostream& operator << (ostream& os, const Foo& rhs) 
    { 
     return os << sizeof(rhs) << endl; 
    } 
}; 

struct Bar { }; 

int main() 
{ 
    Foo f(Bar()); 
    cout << f; 
    return 0; 
} 

Apparantly,上面的代碼編譯罰款,即使是沒有定義

Foo(const Bar&); 

c'tor。與-Wall編譯表明,編譯器解釋爲原型的表達

Foo f(Bar()); 

爲函數

Foo f(Bar (*)()) 

而不是用於創建Foo類型的對象的表達式。

究竟是什麼(catch)(規則)在這裏?

+0

[最煩惱的解析:爲什麼不A a(());工作?](http://stackoverflow.com/questions/1424510/most-vexing-parse-why-doesnt-a-a-work) – Oswald

+0

謝謝奧斯瓦爾德的鏈接。 – Rajat

回答

1
Foo f(Bar()); 

這裏編譯器假設是由於C++「最令人頭痛的解析」而導致的函數調用。

你可以做的只是在你的對象周圍放一個括號。

Foo f((Bar())); 

如果您看到C++ 11文檔,則有更多方法可以避免此行爲。