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

时间:2011-08-04 10:42:29

标签: c++ function constructor declaration definition

以下代码部分中标有“版本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”被视为功能声明。但我不明白为什么以及返回类型为v的结果函数vector<int>的参数是什么。

3 个答案:

答案 0 :(得分:4)

  

为什么

因为标准或多或少地说,任何可能被解释为函数声明的东西在任何情况下都是无论如何。

  

论点是什么

你可能不相信这一点,但这是真的。 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 ++最令人烦恼的解析”。

答案 1 :(得分:2)

这称为most vexing parse

此片段:

  input()

可以消除歧义

  1. 变量类输入的变量定义,采用类输入或
  2. 的匿名实例
  3. 函数的函数声明,它返回一个input类型的对象,并获取一个(未命名的)参数,该参数是一个返回类型输入的函数(并且不进行任何输入)。
  4. 大多数程序员都期望第一个,但C ++标准要求将其解释为第二个。

答案 2 :(得分:1)

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

嗯,这个函数声明的参数是:

  • input(cin) - 这是一个对象
  • input (*)() - 这是一个指向函数返回input并且不参数的指针。