2011-08-04 47 views

回答

4

爲什麼

因爲標準說,或多或少,任何事情都不可能被解釋爲函數聲明會,在任何情況下,不管是什麼。

什麼論據......是

你可能不相信,但這是事實。 input(cin)被視爲input cin;在這一點上,括號是允許的,而且毫無意義。但是,input()不被視爲聲明不帶名稱的input類型的參數;相反,它是input(*)()類型的參數,即指向不帶參數並返回input的函數的指針。顯然,(*)部分在聲明類型時是不必要的。我猜想出於同樣的原因,當你使用函數名初始化函數指針時,&是可選的...

另一種方式來解決這個問題,採取的是我們宣佈的數值分別無論如何辯解跳過的typedef的事實優勢:

istream_iterator<int> start(cin), end; 
vector<int> v(start, end); 

另一種方式是在ISN」的方式添加括號牛逼允許函數聲明:

vector<int> v((input(cin)), input()); 

欲瞭解更多信息,谷歌「C++最棘手的解析」。

+0

我肯定會更喜歡後面的,因爲(現在無效,因爲輸入迭代器不是ForwardIterator,並且迭代它們會使它們失效)迭代器不會停留在周圍。 –

+0

如果你需要的東西不要停留在周圍,你總是可以創建另一個範圍:)但我認爲意外使用無效迭代器的風險很低;你爲什麼會被誘惑? –

+0

這更多的是品味的問題,而不是擔心會發生任何錯誤。他們不必在周圍,他們不需要被命名,所以我更喜歡他們不是。 –

1
vector<int> v(input(cin), input()); 

好了,傳遞到該函數的聲明是這些:

  • input(cin) - 這是一個對象
  • input (*)() - 這是一個指向函數返回input,並採取任何參數。
2

這被稱爲most vexing parse

此片段:

input() 

可消除歧義或者作爲

  1. 變量類輸入變量定義,取類的一個匿名實例輸入或
  2. 函數聲明爲af它返回一個輸入類型的對象,並接受一個單一的(未命名的)參數,該參數是一個返回類型輸入(並且不輸入任何內容)的函數。

大多數程序員都期待第一個,但C++標準要求將其解釋爲第二個。