返回信息流问题出自C++ Standard Library- A Tutorial and Reference, 6.1.2中的一段话。作者说:
std::deque<int> c((std::istream_iterator<int>(std::cin)), (std::istream_iterator<int>())); 这条语句中两个初始化参数的括号是必要的。我测试了一下去掉括号(把deque换成vector了)的情况,也就是:
vector<int> c1(std::istream_iterator<int> (std::cin), std::istream_iterator<int>());
cout << c1[0]<<" "<<c1[1]<<" "<<c1[2]<<endl;
输入为:1 2 3
输出为:1 2 3
至此看来是没有问题的。
但是,如果我把cin前的std::去掉(两参数外围括号也去掉,不去掉不出问题;只去掉第二个参数的括号也没问题),既下面这段代码:
vector<int> c1(std::istream_iterator<int> (cin),std::istream_iterator<int>());
cout << c1[0]<<" "<<c1[1]<<" "<<c1[2]<<" "<<c1[3]<<endl;
结果为:1 1 1
这时候结果就不对了。虽然出现问题的情况不是书上所说,估计也是一个意思。想请问一下这是什么原因?书中解释的此时第一个参数istream_iterator<int> (cin) 相当于类型为istream_iterator<int>,名称为cin,想不明白,type (name),有这么声明变量的吗?
这是一条镜像帖。来源:北邮人论坛 / cpp / #84721同步于 2014/12/12
该镜像源已超过 30 天没有更新,可能在源站已被删除。
CPP机器人发帖
请教一个关于STL 的问题
wanderer
2014/12/12镜像同步3 回复
订阅后,新回复会通过你的通知中心匿名送达。
3 条回复
有点意思。
type (id) 其实是等同于type id的,只不过前面那个很少有人这么写。标准里明确标明了如果 type后面的变量名带括号,可以直接把括号去掉。
这样,vector<int> c1(std::istream_iterator<int> (cin), std::istream_iterator<int>());优先匹配为一个函数声明,返回值为vector<int>,两个参数的类型是std::istream_iterator<int>和std::istream_iterator<int>()。后面那个是一个函数类型(空参数,返回值为std::istream_iterator<int>类型的函数类型)。
【 在 wanderer 的大作中提到: 】
: 问题出自C++ Standard Library- A Tutorial and Reference, 6.1.2中的一段话。作者说:
: std::deque<int> c((std::istream_iterator<int>(std::cin)), (std::istream_iterator<int>())); 这条语句中两个初始化参数的括号是必要的。我测试了一下去掉括号(把deque换成vector了)的情况,也就是:
: vector<int> c1(std::istream_iterator<int> (std::cin), std::istream_iterator<int>());
: ...................
嗯,说的对。我刚才也试了一下,变量名声明确实可以加括号。
后面那个函数类型,无名函数?这个不太懂啊,!
【 在 gaoweiwei 的大作中提到: 】
: 有点意思。
: type (id) 其实是等同于type id的,只不过前面那个很少有人这么写。标准里明确标明了如果 type后面的变量名带括号,可以直接把括号去掉。
: 这样,vector<int> c1(std::istream_iterator<int> (std::cin), std::istream_iterator<int>());优先匹配为一个函数声明,返回值为vector<int>,两个参数的类型是std::istream_iterator<int>和std::istream_iterator<int>()。后面那个是一个函数类型(空参数,返回值为std::istream_iterator<int>类型的函数类型)。
typedef std::istream_iterator<int> SI;
typedef std::istream_iterator<int>(*FN)(); // 函数类型
vector<int> c1(SI si, FN fn); // 一个叫c1的函数声明,它有两个参数
第二个参数不是普通的变量,而是一个函数
【 在 wanderer 的大作中提到: 】
: 嗯,说的对。我刚才也试了一下,变量名声明确实可以加括号。
: 后面那个函数类型,无名函数?这个不太懂啊,!