为什么我不能用一个未命名的临时构造一个std :: istream_iterator?

时间:2010-05-06 16:52:04

标签: c++ constructor istream-iterator

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)'

有谁知道为什么这不起作用? - 谢谢!

2 个答案:

答案 0 :(得分:7)

它没有,因为istream_iterator的构造函数参数是非const引用,但是你提供了一个临时引用。您不能向非const引用提供临时值(即rvalues)。

但是,除非它需要一个const引用,它仍然不起作用,因为ifstream不可复制。奇怪的是,C ++需要一个可访问的复制构造函数来将rvalue绑定到非const引用。

答案 1 :(得分:1)

流由非const引用传递,但临时只能通过const-reference传递。

Streams基本上总是由非const引用传递,因为你用流做的几乎任何东西都可以/将修改流的状态。