N2976constexpr
は、標準ライブラリのいくつかの場所に追加することを提案しました。s はEXCEPT 終了イテレータiostream
には不適切であることに注意してください。constexpr
それでistream_iterator
、デフォルトのコンストラクタistreambuf_iterator
が与えられました。それはそれについてです。constexpr
たとえば、ファイル全体で 1 回だけ表示されるlibstdc++ 実装で確認できます。constexpr
この変更のきっかけとなった LWG は#1129でした。それは言います:
istream_iterator
istreambuf_iterator
リテラルのセンチネル値をサポートする必要があります。デフォルトのコンストラクターは、範囲を終了するために頻繁に使用され、値の型を反復するときにistreambuf_iterator
、のリテラル値になりがち です。istream_iterator
【残り略】
これは私にはあまり意味がありません。誰かが彼らの意味の例を見せてもらえますか?
N3308は、この問題について言及しているが説明していない別の論文です。
がリテラル型である
istream_iterator<T>
必要が あるコンストラクターconstexpr
もあります。T
その意図は、インラインのタイプを格納する既存の実装手法がT
引き続き機能するようにすることです。[libstdc++ はこれを行う_Tp _M_value
] ただし、実際にはこの手法を除外しています。 のデフォルト コンストラクターとコピー コンストラクターをT
マークする必要はありconstexpr
ませistream_iterator<T>
んconstexpr
。
上記は自明なコピー コンストラクターとデストラクタを説明していますが、既定のコンストラクターが constexpr とマークされている理由は説明していません。
さらに、オンライン GCC 5.2.0 でテストして、libstdc++ の実装をコピーしました。唯一の変更点は、constexpr を から削除したことistream_iterator()
です。どちらの場合も、アセンブリは同じです。