C++嵌套构造函数调用与函数声明

C++ nested constructor calls vs. function declaration

本文关键字:函数 声明 函数调用 嵌套 C++      更新时间:2023-10-16

以下代码部分中标记为"版本1"answers"版本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的参数是什么。

为什么

因为标准或多或少地说,任何可能被解释为函数声明的东西,在任何上下文中,无论发生什么,都将是函数声明。

什么论点。。。

你可能不相信,但这是真的。将CCD_ 3处理为CCD_;在这个地方,括号是允许的,而且毫无意义。然而,input()不被视为声明没有名称的input类型的参数;相反,它是input(*)()类型的参数,即指向不带参数并返回input的函数的指针。显然,(*(部分在声明类型时是不必要的。我想也是出于同样的原因,当你使用函数名初始化函数指针时,&是可选的。。。

另一种解决方法是,利用我们无论如何都要单独声明值的事实来证明跳过typedef:是合理的

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

另一种方法是以函数声明不允许的方式添加括号:

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

有关更多信息,请访问谷歌"c++最令人烦恼的解析"。

这被称为最麻烦的解析:

这个片段:

  input()

可以作为消除歧义

  1. 变量类输入的变量定义,采用类输入的匿名实例或
  2. 函数的函数声明,该函数返回类型为input的对象并接受单个(未命名(参数,该参数是返回类型input(不接受输入(的函数

大多数程序员都期望第一个,但C++标准要求将其解释为第二个。

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

这个函数声明的参数是:

  • input(cin)-是一个对象
  • input (*)()—它是指向返回input且不带参数的函数的指针