用istream_iterator构造vector出错

cphj 2009-10-12 01:37:08
1. 代码功能
从键盘输入多行字符,以空白分隔,以CTRL+Z结束,存入到vector<string>中

2. 问题
自认为简单的写法f1(),偏偏不行
而换成其他2种等价的写法f2()、f3(),都正确
f2()仅仅是明确定义一个有名对象替代无名对象
f3()仅仅是在无名对象外围加了一对括号
请问为什么f1()不正确?

3. 错误现象
f1()在VC2005下编译能通过,但报告警(手头没有GCC,没法试GCC的结果)
warning C4930: “std::vector<_Ty> vi(std::istream_iterator<_Ty>,std::istream_iterator<_Ty> (__cdecl *)(void))”: 未调用原型函数(是有意用变量定义的吗?)
1> with
1> [
1> _Ty=std::string
1> ]
如果在main()里面调f1()并下断点,也可以看到vi实际并没有构造成功
f2()、f3()都正常

4. 我自己的初步分析
f1()中的语句似乎被编译器认为是函数声明了
搜索了以下之前的帖子,有人说最好不要对控制台输入用istream_iterator,我换成ifstream试了一下,结果一样
我也怀疑是编译器语法解析问题,但问题是如何发生的,谁能提供一个确切的解释,请告知

5. 代码
#include <iostream>
#include <vector>
#include <string>
using namespace std;

void f1()
{
vector<string> vi(istream_iterator<string>(cin), istream_iterator<string>()); // 有问题
}

void f2()
{
istream_iterator<string> eof;
vector<string> vi(istream_iterator<string>(cin), eof); // 没问题
}

void f3()
{
vector<string> vi(istream_iterator<string>(cin), (istream_iterator<string>())); // 没问题
}

int main()
{
//在这里调f1();或者f2();或者f3()之一(注意是之一);,然后在对应f1、f2、f3中可以下断点察看
return 0;
}
...全文
146 5 打赏 收藏 转发到动态 举报
写回复
用AI写文章
5 条回复
切换为时间正序
请发表友善的回复…
发表回复
mstlq 2009-10-12
  • 打赏
  • 举报
回复
http://www.stlchina.org/documents/EffectiveSTL/index.html
请参考《Effective STL》条款6
跟楼主一模一样的问题,详细的解释^_^
cphj 2009-10-12
  • 打赏
  • 举报
回复
原来是effective STL 条款6 警惕C++最令人恼怒的解析

第一个参数加括号也行
vector<string> vi((istream_iterator<string>(cin)), istream_iterator<string>());
看来读十诫还是有必要的

结贴
晨星 2009-10-12
  • 打赏
  • 举报
回复
你的分析是对的。
你可以试试:
typedef istream_iterator<string>(MyType);
是可以编译通过的,因此,这一行
vector<string> vi(istream_iterator<string>(cin), istream_iterator<string>());
相当于声明了一个函数,其返回类型为vector<string>,两个参数的类型都相当于上面的MyType类型,其中第一个形参的名字叫cin,而第二个则是无名形参(相当于:void f(int)这种的)。
这里的主要问题是,当一条语句可以解析为一个声明的时候,编译器便将它优先作为声明来看待。

再说得简单点,你那行语句相当于:
typedef istream_iterator<string>(MyType);
vector<string> vi(MyType cin, MyType);
  • 打赏
  • 举报
回复
vector<string> vi(istream_iterator<string>(cin), istream_iterator<string>()); 

改成
vector<string> vi((istream_iterator<string>(cin)),( istream_iterator<string>()) ); 
taodm 2009-10-12
  • 打赏
  • 举报
回复
《effective stl》item29

64,666

社区成员

发帖
与我相关
我的任务
社区描述
C++ 语言相关问题讨论,技术干货分享,前沿动态等
c++ 技术论坛(原bbs)
社区管理员
  • C++ 语言社区
  • encoderlee
  • paschen
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
  1. 请不要发布与C++技术无关的贴子
  2. 请不要发布与技术无关的招聘、广告的帖子
  3. 请尽可能的描述清楚你的问题,如果涉及到代码请尽可能的格式化一下

试试用AI创作助手写篇文章吧