是否有istream常量迭代器?

问题描述 投票:0回答:1

是否有std :: istream const迭代器之类的东西?

以下代码将无法编译,因为std::istream_iterator中的foo()无法绑定到const std::istream对在main()中创建的临时对象的引用。

// main.cpp
#include <iostream>
#include <sstream>
#include <iterator>

void foo( const std::istream& s )
{
  std::istream_iterator<char> i( s );
  // No std::istream_const_iterator, but anything by another name?
  std::cout << *i;
}

int main( int argc, char* argv[] )
{
  std::string p( "abcdefghijklmnopqrstuvwxyz" );
  foo( std::stringstream(p) );

  return 0;
}

是否存在可以绑定到常量istreamistream迭代器?

刚刚问过this question,我才知道istream_iterator ctor初始化并执行第一次读取。我想我还是不太清楚:读取的内容是否一定会修改绑定的istream?如果没有,似乎应该有某种可以绑定到const istream的const迭代器,不是吗?

$ g++ --version
g++ (GCC) 9.2.1 20190827 (Red Hat 9.2.1-1)
Copyright (C) 2019 Free Software Foundation, Inc.
This is free software; see the source for copying conditions.  There is NO
warranty; not even for MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.

$ g++ -g ./main.cpp && ./a.out
./main.cpp: In function ‘void foo(const istream&)’:
./main.cpp:84:34: error: binding reference of type ‘std::istream_iterator<char>::istream_type&’ {aka ‘std::basic_istream<char>&’} to ‘const istream’ {aka ‘const std::basic_istream<char>’} discards qualifiers
   84 |   std::istream_iterator<char> i( s );
      |                                  ^
In file included from /usr/include/c++/9/iterator:66,
                 from ./main.cpp:80:
/usr/include/c++/9/bits/stream_iterator.h:68:38: note:   initializing argument 1 of ‘std::istream_iterator<_Tp, _CharT, _Traits, _Dist>::istream_iterator(std::istream_iterator<_Tp, _CharT, _Traits, _Dist>::istream_type&) [with _Tp = char; _CharT = char; _Traits = std::char_traits<char>; _Dist = long int; std::istream_iterator<_Tp, _CharT, _Traits, _Dist>::istream_type = std::ba
sic_istream<char>]’
   68 |       istream_iterator(istream_type& __s)
      |                        ~~~~~~~~~~~~~~^~~
c++ istream const-iterator istream-iterator
1个回答
2
投票

读取是否必定会修改绑定的istream

[istream_iterator是一种便利类,它使人们可以将istream对象当作容器,例如std::vector或数组。

在下面,istream是用于从流中读取的对象。是的,从流中读取确实会修改istreamistream还能如何跟踪内部状态以指示读取尝试是否成功,读取了多少个字符等?

由于需要读取非const istream对象,因此无法根据istream_iterator对象构造const istream

© www.soinside.com 2019 - 2024. All rights reserved.