2013-02-16 88 views
-1

的我不能做到這一點:實例類和函數的返回類型混亂

class A 
{ 
    public: 
    A() 
    { 
    } 

}; 

A a1(); 

因爲A a1();看起來像一個函數原型。

但我可以這樣做:

class B 
{ 
    public: 
    B(std::string argument) 
    { 
     std::cout << argument; 
    } 
}; 

B b1("Text"); 

這兩件事基本上是相同的,除了編譯器能夠區分B b1("Text");爲不是函數的原型,因爲有些數據在括號過去了。

是否有任何理由爲什麼括號必須省略A,或者是因爲編譯器認爲它是一個函數定義的原因?

+0

這被稱爲_most vexing parse_,它在堆棧溢出時已經被很好地覆蓋了。請查看鏈接副本以及右側的「相關」邊欄。 – 2013-02-16 17:40:51

回答

0

就是這樣,它被稱爲最令人頭痛的解析。原因是,如果A a1();被視爲對象聲明,那麼您將無法使用該原型聲明函數。你想能夠聲明一個函數,對嗎?

B b1("Text");的工作原理,因爲它不能被視爲一個函數原型,但例如,B b(A());可以和將會。

+0

這不是一個令人煩惱的解析,但不是*最* *煩惱? – 2013-02-16 17:27:39

+0

+1我通常不會在顯而易見的重複上得到答案,但是你的第一段是_that_好:) – 2013-02-16 17:41:47

+0

@LightnessRacesinOrbit它沒有被制定爲最多,這就是爲什麼我回答(我一直在鋪設顯而易見的最近)。 – 2013-02-16 17:57:35