以下代码部分中标有“版本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>
的参数是什么。
答案 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)
此片段:
input()
可以消除歧义
大多数程序员都期望第一个,但C ++标准要求将其解释为第二个。
答案 2 :(得分:1)
vector<int> v(input(cin), input());
嗯,这个函数声明的参数是:
input(cin)
- 这是一个对象input (*)()
- 这是一个指向函数返回input
并且不参数的指针。