27 Iterators library [iterators]

27.6 Stream iterators [stream.iterators]

27.6.1 Class template istream_­iterator [istream.iterator]

Шаблон класса istream_­iterator - это объект, input iterator который считывает (использует operator>>) последовательные элементы из входного потока, для которого он был создан. После создания и каждый раз ++ использования итератор считывает и сохраняет значение T. Если итератору не удается прочитать и сохранить значение T (fail() в возвращаемом потоке true), итератор становится равным end-of-stream значению итератора. Конструктор без аргументов istream_­iterator() всегда создает объект итератора ввода конца потока, который является единственным допустимым итератором, который может использоваться для условия окончания. Результат operator* итератора в конце потока не определен. Для любого другого итератораconst T& возвращается значение a . Результат operator-> итератора в конце потока не определен. Для любого другого итератораconst T* возвращается значение a . Поведение программы, которая применяется operator++() к итератору конца потока, не определено. Невозможно хранить что-либо в итераторах istream. Тип T должен соответствовать DefaultConstructible, CopyConstructibleи CopyAssignable требованиям.

Два итератора конца потока всегда равны. Итератор конца потока не равен итератору конца потока. Два итератора без конца потока равны, если они построены из одного и того же потока.

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();
    istream_iterator(istream_type& s);
    istream_iterator(const istream_iterator& x) = default;
    ~istream_iterator() = default;

    const T& operator*() const;
    const T* operator->() const;
    istream_iterator& operator++();
    istream_iterator  operator++(int);
  private:
    basic_istream<charT,traits>* in_stream; // exposition only
    T value;                                // exposition only
  };

  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);
  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);
}

27.6.1.1 istream_­iterator constructors and destructor [istream.iterator.cons]

constexpr istream_iterator();

Effects: Создает итератор конца потока. Если is_­trivially_­default_­constructible_­v<T> есть true, то этот конструктор является конструктором constexpr.

Postconditions: in_­stream == 0.

istream_iterator(istream_type& s);

Effects: Инициализируется in_­stream с помощью addressof(s). value может быть инициализирован во время построения или при первом обращении к нему.

Postconditions: in_­stream == addressof(s).

istream_iterator(const istream_iterator& x) = default;

Effects: Создает копию x. Если is_­trivially_­copy_­constructible_­v<T> есть true, то этот конструктор является тривиальным конструктором копирования.

Postconditions: in_­stream == x.in_­stream.

~istream_iterator() = default;

Effects: Итератор уничтожен. Если is_­trivially_­destructible_­v<T> есть true, то этот деструктор является тривиальным деструктором.

27.6.1.2 istream_­iterator operations [istream.iterator.ops]

const T& operator*() const;

Returns: value.

const T* operator->() const;

Returns: addressof(operator*()).

istream_iterator& operator++();

Requires: in_­stream != 0.

Effects: Как будто по: *in_­stream >> value;

Returns: *this.

istream_iterator operator++(int);

Requires: in_­stream != 0.

Effects: Как будто по:

istream_iterator tmp = *this;
*in_stream >> value;
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.

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 == y)