繁体   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