2

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>::istream_iterator(std::ifstream)'</p>

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

4

2 回答 2

7

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

但除此之外,即使它需要一个 const 引用,它仍然无法工作,因为ifstream它不可复制。奇怪的是,C++ 需要一个可访问的复制构造函数来将一个右值绑定到一个非常量引用。

于 2010-05-06T16:54:54.550 回答
2

流通过非常量引用传递,但临时只能通过 const 引用传递。

流本质上总是通过非常量引用传递,因为您对流所做的几乎任何事情都可以/将修改流的状态。

于 2010-05-06T16:56:04.510 回答