C++ 为什么可以';我用一个未命名的临时变量构造一个std::istream_迭代器?

C++ 为什么可以';我用一个未命名的临时变量构造一个std::istream_迭代器?,c++,constructor,istream-iterator,C++,Constructor,Istream Iterator,g++允许从ifstream实例构造istream_迭代器: std::ifstream ifstr("test.txt"); std::istream_iterator<std::string> iter1(ifstr); std::ifstream ifstr(“test.txt”); std::istream_迭代器iter1(ifstr); …但它不允许使用未命名的临时对象进行相同的构造: std::istream_iterator<std::string>

g++允许从ifstream实例构造istream_迭代器:

std::ifstream ifstr("test.txt");
std::istream_iterator<std::string> iter1(ifstr);
std::ifstream ifstr(“test.txt”);
std::istream_迭代器iter1(ifstr);
…但它不允许使用未命名的临时对象进行相同的构造:

std::istream_iterator<std::string> iter2(std::ifstream("test.txt"));
std::istream_迭代器iter2(std::ifstream(“test.txt”);
这使得:

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


有人知道为什么这样不行吗谢谢

它不是,因为
istream\u迭代器的构造函数参数是一个非常量引用,但您提供了一个临时参数。不能为非常量引用提供临时值(即右值)


但撇开它不谈,即使它需要一个const引用,它仍然不起作用,因为
ifstream
是不可复制的。奇怪的是,C++需要一个可访问的复制构造函数将一个rValp绑定到一个非const引用。p> 流通过非常量引用传递,但临时流只能通过常量引用传递


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

然后,如果允许的话,您将创建一个迭代器,用于已销毁的ifstream,这将