簡體   English   中英

C ++嵌套構造函數調用與函數聲明

[英]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()

可以消除歧義,因為

  1. 變量類輸入的變量定義,采用類輸入的匿名實例或
  2. 函數的函數聲明,該函數返回輸入類型的對象並接受單個(未命名)參數,該參數是返回類型輸入(不輸入)的函數。

大多數程序員期望第一個,但是C ++標准要求將其解釋為第二個。

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

好了,此函數聲明的參數如下:

  • input(cin) -這是一個對象
  • input (*)() -這是指向返回input且不帶參數的函數的指針。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM