istream_iterator<T, CharT, Traits, Distance>& operator++(); // (1) C++98
istream_iterator<T, CharT, Traits, Distance> operator++(int); // (2) C++98
istream_iterator operator++(int) = default; // (2) C++29
概要
イテレータを進める。
入力ストリームからoperator>>でデータを読み取る。
事前条件
*thisが終端イテレータではないこと(保持している入力ストリームへのポインタがヌルポインタではないこと)。この条件を満たさない場合、動作は未定義である。
効果
前置operator++:
*in_stream >> value;
return *this;
後置operator++:
istream_iterator<T, CharT, Traits, Distance> tmp = *this;
*in_stream >> value;
return tmp;
※in_streamは、メンバ変数として保持している入力ストリームオブジェクトへのポインタ
備考
- (2) : C++29で、後置インクリメント・デクリメント演算のdefault定義を使用した
= default定義へ規定が変更された。動作は変わらない
例
#include <iostream>
#include <iterator>
#include <sstream>
int main()
{
std::stringstream ss;
ss << 1 << std::endl
<< 2 << std::endl
<< 3;
std::istream_iterator<int> it(ss);
std::istream_iterator<int> last;
for (; it != last; ++it) {
int result = *it;
std::cout << result << std::endl;
}
}
出力
1
2
3
参照
- LWG Issue 838. Can an end-of-stream iterator become a non-end-of-stream one?
- C++11で、終端イテレータに対してこの演算子を呼び出したときの動作は未定義であることが明記された。終端イテレータが再び非終端イテレータに戻ることはない
- P3785R1 Library Wording Changes for Defaulted Postfix Increment and Decrement Operations
- C++29で、後置演算子の規定が
= default定義へ書き換えられた
- C++29で、後置演算子の規定が