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

Stu*_*789 2 c++ constructor istream-iterator

g ++允许从ifstream实例构造istream_iterator:

std::ifstream ifstr("test.txt");
std::istream_iterator<std::string> iter1(ifstr);
Run Code Online (Sandbox Code Playgroud)

...但它不允许使用未命名的临时构造:

std::istream_iterator<std::string> iter2(std::ifstream("test.txt"));
Run Code Online (Sandbox Code Playgroud)

这给出了:

错误:没有用于调用'std :: istream_iterator,ptrdiff_t> :: istream_iterator(std :: ifstream)'的匹配函数

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

Joh*_*itb 7

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

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