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
.