[istream.iterator] (original) (raw)
24.6.2.1 General [istream.iterator.general]
The class template istream_iteratoris an input iterator ([input.iterators]) that reads successive elements from the input stream for which it was constructed.
namespace std { template<class T, class charT = char, class traits = char_traits<charT>,class Distance = ptrdiff_t> class istream_iterator { public: using iterator_category = input_iterator_tag;using value_type = T;using difference_type = Distance;using pointer = const T*;using reference = const T&;using char_type = charT;using traits_type = traits;using istream_type = basic_istream<charT,traits>;constexpr istream_iterator();constexpr istream_iterator(default_sentinel_t); istream_iterator(istream_type& s);constexpr istream_iterator(const istream_iterator& x) noexcept(see below);~istream_iterator() = default; istream_iterator& operator=(const istream_iterator&) = default;const T& operator*() const;const T* operator->() const; istream_iterator& operator++(); istream_iterator operator++(int);friend bool operator==(const istream_iterator& i, default_sentinel_t);private: basic_istream<charT,traits>* in_stream; T value; };}
The type T shall meet the Cpp17DefaultConstructible,Cpp17CopyConstructible, and Cpp17CopyAssignable requirements.
24.6.2.2 Constructors and destructor [istream.iterator.cons]
constexpr istream_iterator();constexpr istream_iterator(default_sentinel_t);
Effects: Constructs the end-of-stream iterator, value-initializing value.
Postconditions: in_stream == nullptr is true.
Remarks: If the initializer T() in the declaration auto x = T();is a constant initializer ([expr.const]), then these constructors are constexpr constructors.
istream_iterator(istream_type& s);
Effects: Initializes in_stream with addressof(s), value-initializes value, and then calls operator++().
constexpr istream_iterator(const istream_iterator& x) noexcept(_see below_);
Effects: Initializes in_stream with x.in_stream and initializes value with x.value.
Remarks: An invocation of this constructor may be used in a core constant expression if and only if the initialization of value from x.valueis a constant subexpression ([defns.const.subexpr]).
The exception specification is equivalent tois_nothrow_copy_constructible_v<T>.
~istream_iterator() = default;
Remarks: If is_trivially_destructible_v<T> is true, then this destructor is trivial.
24.6.2.3 Operations [istream.iterator.ops]
const T& operator*() const;
Preconditions: in_stream != nullptr is true.
const T* operator->() const;
Preconditions: in_stream != nullptr is true.
Returns: addressof(value).
istream_iterator& operator++();
Preconditions: in_stream != nullptr is true.
Effects: Equivalent to:if (!(*in_stream >> value)) in_stream = nullptr;
istream_iterator operator++(int);
Preconditions: in_stream != nullptr is true.
Effects: Equivalent to:istream_iterator tmp = *this;++*this;return tmp;
template<class T, class charT, class traits, class Distance> bool operator==(const istream_iterator<T,charT,traits,Distance>& x,const istream_iterator<T,charT,traits,Distance>& y);
Returns: x.in_stream == y.in_stream.
friend bool operator==(const istream_iterator& i, default_sentinel_t);