- iterator[meta header]
- std[meta namespace]
- istream_iterator[meta class]
- function[meta id-type]
istream_iterator(); // (1) C++03
constexpr istream_iterator(); // (1) C++11
constexpr istream_iterator(default_sentinel_t); // (2) C++20
istream_iterator(istream_type& s); // (3)
istream_iterator(const istream_iterator& x); // (4) C++03
istream_iterator(const istream_iterator& x) = default; // (4) C++11
constexpr istream_iterator(const istream_iterator& x)
noexcept(see below); // (4) C++23- see below[italic]
- (1) : デフォルトコンストラクタ。メンバ変数として保持する入力ストリームへのポインタをヌル初期化する。デフォルトコンストラクタで構築された
istream_iteratorオブジェクトは、イテレータの終端値として使用できる。 - (2) :
default_sentinelを受け取り、(1)と同等の構築をより明示的に行う。 - (3) : 入力ストリームオブジェクトへの参照を受け取り、メンバ変数にそのオブジェクトへのポインタを保持する。
operator*()で現在参照している値を返すために、この段階で入力ストリームから値を読み取り、メンバ変数に値を保持する。 - (4) : コピーコンストラクタ
- (4) :
- C++23 :
noexcept(see below)の例外指定は、is_nothrow_copy_constructible_v<T>と等価である。
- C++23 :
- (4) : C++23では、メンバ変数(入力ストリームへのポインタと保持値)をコピー初期化する明示的な定義に変更された。値型
Tがトリビアルにコピー構築可能であってもコピーコンストラクタはトリビアルにならない(ABI互換性のための変更)。
#include <iostream>
#include <iterator>
#include <sstream>
#include <algorithm>
int main()
{
std::stringstream ss;
ss << 1 << std::endl
<< 2 << std::endl
<< 3;
std::istream_iterator<int> it(ss); // 入力ストリームオブジェクトへの参照を渡す
std::istream_iterator<int> last; // デフォルト構築。終端値として使用する
std::for_each(it, last, [](int x) {
std::cout << x << std::endl;
});
}- std::stringstream[link /reference/sstream/basic_stringstream.md]
1
2
3
- LWG Issue 2576.
istream_iteratorandostream_iteratorshould usestd::addressof - LWG Issue 3600. Making
istream_iteratorcopy constructor trivial is an ABI break- C++23で、コピーコンストラクタが
= defaultから明示的に定義された非トリビアルなコンストラクタ(constexpr・noexcept指定付き)に変更された。既存実装とのABI互換性を保つため、トリビアル化が見送られた
- C++23で、コピーコンストラクタが