The
class template
istreambuf_iterator
defines an
input iterator that
reads successive
characters
from the streambuf for which it was constructed
. operator*
provides access to the current input character, if any
. Each time
operator++
is evaluated, the iterator advances to the next input character
. If the end of stream is reached (
streambuf_type::sgetc() returns
traits::eof()),
the iterator becomes equal to the
end-of-stream
iterator value
. The default constructor
istreambuf_iterator()
and the constructor
istreambuf_iterator(0)
both construct an end-of-stream iterator object suitable for use
as an end-of-range
. All specializations of
istreambuf_iterator shall have a trivial copy
constructor, a
constexpr default constructor, and a trivial destructor
.The result of
operator*()
on an end-of-stream iterator is undefined
. For any other iterator value a
char_type
value is returned
. It is impossible to assign a character via an input iterator
.
namespace std {
template<class charT, class traits = char_traits<charT>>
class istreambuf_iterator {
public:
using iterator_category = input_iterator_tag;
using value_type = charT;
using difference_type = typename traits::off_type;
using pointer = unspecified;
using reference = charT;
using char_type = charT;
using traits_type = traits;
using int_type = typename traits::int_type;
using streambuf_type = basic_streambuf<charT,traits>;
using istream_type = basic_istream<charT,traits>;
class proxy;
constexpr istreambuf_iterator() noexcept;
istreambuf_iterator(const istreambuf_iterator&) noexcept = default;
~istreambuf_iterator() = default;
istreambuf_iterator(istream_type& s) noexcept;
istreambuf_iterator(streambuf_type* s) noexcept;
istreambuf_iterator(const proxy& p) noexcept;
istreambuf_iterator& operator=(const istreambuf_iterator&) noexcept = default;
charT operator*() const;
istreambuf_iterator& operator++();
proxy operator++(int);
bool equal(const istreambuf_iterator& b) const;
private:
streambuf_type* sbuf_; };
template<class charT, class traits>
bool operator==(const istreambuf_iterator<charT,traits>& a,
const istreambuf_iterator<charT,traits>& b);
template<class charT, class traits>
bool operator!=(const istreambuf_iterator<charT,traits>& a,
const istreambuf_iterator<charT,traits>& b);
}
namespace std {
template<class charT, class traits>
class istreambuf_iterator<charT, traits>::proxy { charT keep_;
basic_streambuf<charT,traits>* sbuf_;
proxy(charT c, basic_streambuf<charT,traits>* sbuf)
: keep_(c), sbuf_(sbuf) { }
public:
charT operator*() { return keep_; }
};
}
Class
istreambuf_iterator<charT,traits>::proxy
is for exposition only
. An implementation is permitted to provide equivalent functionality without
providing a class with this name
. Class
istreambuf_iterator<charT, traits>::proxy
provides a temporary
placeholder as the return value of the post-increment operator
(
operator++)
. It keeps the character pointed to by the previous value
of the iterator for some possible future access to get the character
.