g ++允许从ifstream实例构造istream_iterator:
std::ifstream ifstr("test.txt");
std::istream_iterator<std::string> iter1(ifstr);
...但它不允许使用未命名的临时构造:
std::istream_iterator<std::string> iter2(std::ifstream("test.txt"));
这给出了:
错误:没有匹配函数来调用'std :: istream_iterator,ptrdiff_t&gt; :: istream_iterator(std :: ifstream)'
有谁知道为什么这不起作用? - 谢谢!
答案 0 :(得分:7)
它没有,因为istream_iterator
的构造函数参数是非const引用,但是你提供了一个临时引用。您不能向非const引用提供临时值(即rvalues)。
但是,除非它需要一个const引用,它仍然不起作用,因为ifstream
不可复制。奇怪的是,C ++需要一个可访问的复制构造函数来将rvalue绑定到非const引用。
答案 1 :(得分:1)
流由非const引用传递,但临时只能通过const-reference传递。
Streams基本上总是由非const引用传递,因为你用流做的几乎任何东西都可以/将修改流的状态。