[英]C++ nested constructor calls vs. function declaration
以下代碼部分中標記為“版本1”和“版本2”的代碼段之間有什么區別:
int main() {
using namespace std;
typedef istream_iterator<int> input;
// version 1)
//vector<int> v(input(cin), input());
// version 2)
input endofinput;
vector<int> v(input(cin), endofinput);
}
據我了解,“版本1”被視為函數聲明。 但是我不明白為什么返回類型為vector<int>
的結果函數v
的參數也不是。
為什么
因為該標准或多或少地表明,在任何情況下,任何可能被解釋為函數聲明的東西都將是無論如何。
有什么爭論...
您可能不相信這一點,但這是事實。 input(cin)
視為input cin
; 在這一點上,括號是允許的,只是沒有意義。 但是, input()
不能被視為聲明類型為input
的參數而沒有名稱; 相反,它是類型為input(*)()
的參數,即,指向不帶參數並返回input
的函數的指針。 顯然,在聲明類型時不需要(*)部分。 我猜出於同樣的原因,當您使用函數名稱初始化函數指針時, &
是可選的...
解決這個問題的另一種方法,利用我們無論如何都要分別聲明值來證明跳過typedef的事實:
istream_iterator<int> start(cin), end;
vector<int> v(start, end);
另一種方法是以函數聲明所不允許的方式添加括號:
vector<int> v((input(cin)), input());
有關更多信息,請使用Google“最煩人的c ++解析”。
這稱為最煩人的解析 :
此代碼段:
input()
可以消除歧義,因為
大多數程序員期望第一個,但是C ++標准要求將其解釋為第二個。
vector<int> v(input(cin), input());
好了,此函數聲明的參數如下:
input(cin)
-這是一個對象 input (*)()
-這是指向返回input
且不帶參數的函數的指針。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.