2

「Accelerated C++」本の第 8 章を読んでいます。セクション 8.3 は、入力イテレータと出力イテレータに関するものです。

vector<int> v; // read ints from the standard input and append them to v
copy(istream_iterator<int>(cin), istream_iterator<int>(), back_inserter(v));

[...]

copy の 2 番目の引数は、どのファイルにもバインドされていないデフォルト (空の) istream_iterator を作成します。istream_iterator 型にはデフォルト値があり、ファイルの終わりに達したか、エラー状態にある istream_iterator はデフォルト値と同じに見えるというプロパティがあります。したがって、デフォルト値を使用して、コピーの「1 つ後」の規則を示すことができます。

これは私が理解していることです: istream_iterator はテンプレート クラスであり、 istream_iterator< int> はテンプレートのインスタンスです。istream_iterator< int>() を記述すると、istream_iterator< int> オブジェクトの値の初期化がトリガーされます。これは、ゼロ初期化 + 暗黙的なデフォルト コンストラクター ( http://en.cppreference.com/w/cpp/language/value_initialization ) の呼び出しを意味します。istream_iterator< int> オブジェクトのデフォルトの初期化も同様に機能すると考えたので (トリガーはデフォルトのコンストラクターを呼び出します)、これを試しました。

vector<int> v; // read ints from the standard input and append them to v
copy(istream_iterator<int>(cin), istream_iterator<int>, back_inserter(v));

しかし、これはコンパイルされません:

エラー: ',' トークンの前にプライマリ式が必要です

何が起こっているのかわかりません。どんな説明でも大歓迎です。

4

4 に答える 4

2

一時的な値を初期化するのではなく、デフォルトで初期化する方法はありません。式type()は値で初期化された一時を作成しますが、型名だけでは有効な式ではありません。

ただし、既定のコンストラクターを宣言する任意の型 (このようなもの) では、既定の初期化と値の初期化は同等です。非暗黙的なコンストラクターが呼び出される前にゼロ初期化はありません。

于 2013-08-02T14:37:54.110 に答える
0

istream_iterator「テンプレート化された」クラス です 2 つのコンストラクターを提供します。

  basic_istream<charT,traits>* in_stream;
  istream_iterator() : in_stream(0) {}
  istream_iterator(istream_type& s) : in_stream(&s) { ++*this; }

デフォルトのコンストラクターは、ストリームの終わりin_streamに使用されるように初期化されます0

そう、

istream_iterator<int>()EOFの必要性

修理:- copy(istream_iterator<int>(cin), istream_iterator<int>(), back_inserter(v));

于 2013-08-02T14:32:10.623 に答える