【问题标题】:Why can't I construct an std::istream_iterator with an unnamed temporary?为什么我不能用未命名的临时构造 std::istream_iterator?
【发布时间】:2010-05-06 16:52:04
【问题描述】:

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

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

【问题讨论】:

    标签: c++ constructor istream-iterator


    【解决方案1】:

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

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

    【讨论】:

    • 再一次,如果允许,您将创建一个迭代器到一个已经销毁的 ifstream,这将是 UB
    【解决方案2】:

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

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

    【讨论】:

      猜你喜欢
      • 2017-03-13
      • 2019-02-27
      • 1970-01-01
      • 2021-01-19
      • 2016-04-22
      • 2015-05-28
      • 2016-06-28
      • 1970-01-01
      • 2015-08-28
      相关资源
      最近更新 更多