以下のスニペットは、から 3 つの整数を読み取りますstd::cin
。2 を書き込みnumbers
、3 番目を破棄します。
std::vector<int> numbers(2);
copy_n(std::istream_iterator<int>(std::cin), 2, numbers.begin());
コードが から正確に 2 つの整数を読み取ることを期待してstd::cin
いましたが、これは標準に準拠した正しい動作であることがわかりました。これは標準の見落としですか?この行動の根拠は何ですか?
C++03 標準の 24.5.1/1 から:
構築後、++ が使用されるたびに、反復子は の値を読み取って格納します
T
。
したがって、上記のコードでは、呼び出し時点でストリーム イテレータが既に 1 つの整数を読み取っています。その時点以降、アルゴリズムの反復子によるすべての読み取りは先読みであり、前の読み取りからキャッシュされた値が生成されます。
次の標準であるn3225の最新のドラフトは、ここで何の変更も受けていないようです (24.6.1/1)。
関連する注意事項として、コンストラクターに関する現在の標準の 24.5.1.1/2 はistream_iterator(istream_type& s)
読み取ります
効果: で初期化
in_stream
しs
ます。value
構築中または最初に参照されたときに初期化される場合があります。
「初期化する必要がある」とは対照的に、「初期化されるvalue
可能性があります...」に重点を置いています。これは 24.5.1/1 と矛盾しているように聞こえますが、それ自体が疑問に値するかもしれません。