是什麼標記的代碼段之間的差「的版本1」和「第2版」 「被視爲功能聲明。但我不明白爲什麼也沒有什麼結果函數v
的參數與返回類型vector<int>
是。C++嵌套構造在下面的代碼段調用與函數聲明
2
A
回答
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++最棘手的解析」。
1
vector<int> v(input(cin), input());
好了,傳遞到該函數的聲明是這些:
input(cin)
- 這是一個對象input (*)()
- 這是一個指向函數返回input
,並採取任何參數。
2
這被稱爲most vexing parse:
此片段:
input()
可消除歧義或者作爲
- 變量類輸入變量定義,取類的一個匿名實例輸入或
- 函數聲明爲af它返回一個輸入類型的對象,並接受一個單一的(未命名的)參數,該參數是一個返回類型輸入(並且不輸入任何內容)的函數。
大多數程序員都期待第一個,但C++標準要求將其解釋爲第二個。
相關問題
- 1. C#構造函數聲明
- 2. 哪個構造函數被調用下面的代碼
- 3. C++。奇怪的構造函數聲明?
- 4. 函數聲明,而不是用C調用構造++
- 5. 執行代碼後調用構造函數的C#構造函數
- 6. C++嵌套構造函數調用問題
- 7. 使用構造函數聲明(構造函數?)
- 8. 如何在JMockit中測試以下代碼段的構造函數調用
- 9. 在Java中調用super的構造函數聲明
- 10. 嵌套類構造函數調用私有構造函數,它工作嗎?
- 11. 在構造嵌套類(C++)
- 12. 在構造函數中聲明方法
- 13. 聲明在構造函數中
- 14. 對象構造函數調用未聲明在此範圍內
- 15. C#調用構造函數
- 16. 什麼時候在嵌套類中調用構造函數(Java)
- 17. SFINAE重複的構造函數聲明
- 18. 類的構造函數聲明
- 19. 不使用它的構造函數的C++類聲明
- 20. 在C++中調用的構造函數
- 21. 嵌套類的公共構造函數
- 22. 帶嵌套構造函數的CA2000
- 23. 在構造函數或字段聲明中初始化列表
- 24. 如何調用嵌套類的構造函數
- 25. 調用嵌套的私有構造函數
- 26. 作爲構造函數參數的構造函數調用將聲明作爲函數指針進行評估
- 27. 如何使用可變宏調用嵌套構造函數?
- 28. PLSQL函數聲明嵌套表
- 29. 隱藏的構造函數在c#中不可能嵌套類?
- 30. 如何在C++中初始化嵌套類的構造函數
我肯定會更喜歡後面的,因爲(現在無效,因爲輸入迭代器不是ForwardIterator,並且迭代它們會使它們失效)迭代器不會停留在周圍。 –
如果你需要的東西不要停留在周圍,你總是可以創建另一個範圍:)但我認爲意外使用無效迭代器的風險很低;你爲什麼會被誘惑? –
這更多的是品味的問題,而不是擔心會發生任何錯誤。他們不必在周圍,他們不需要被命名,所以我更喜歡他們不是。 –