接下来我要写的几行来自“C++标准库-教程和参考”一书。
使用标准输入初始化:
//read all integer elements of the deque from standard input
std::deque<int> c((std::istream_iterator<int>(std::cin)),
(std::istream_iterator<int>()));这里不要忘记初始化器参数周围的额外括号。否则,这个表达式会做一些非常不同的事情,您可能会在下面的语句中得到一些奇怪的警告或错误。考虑在不加括号的情况下编写语句:
std::deque<int> c(std::istream_iterator<int>(std::cin),
std::istream_iterator<int>());在本例中,c声明一个函数,其返回类型为deque。其第一个参数为名称cin的istream_iterator类型,第二个未命名参数为“函数不带返回istream_iterator的参数”。此构造作为声明或表达式在语法上是有效的。因此,根据语言规则,它被视为一种声明。额外的括号强制初始化器与声明的语法不匹配。
我明白为什么带额外括号的那个不被认为是一个函数声明,但是我看不出是什么使不加括号的那个变成函数声明呢?因为它在(std::cin)周围有括号,据我所知,变量可能没有带括号的名称?
我是不是遗漏了什么?
发布于 2012-01-17 23:24:06
如果可以将语句解析为函数原型或带有构造函数参数的变量声明,则函数原型优先。这与大多数人的期望相反,因此被命名为最令人烦恼的Parse。
https://stackoverflow.com/questions/8903082
复制相似问题