[英]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.