2

g++ を使用すると、ifstream インスタンスから istream_iterator を構築できます。

std::ifstream ifstr("test.txt");
std::istream_iterator<std::string> iter1(ifstr);

...しかし、名前のない一時的なもので同じ構築を行うことはできません:

std::istream_iterator<std::string> iter2(std::ifstream("test.txt"));

これは与える:

エラー: 'std::istream_iterator, ptrdiff_t>::istream_iterator(std::ifstream)' の呼び出しに一致する関数がありません</p>

これが機能しない理由を誰かが知っていますか?- ありがとう!

4

2 に答える 2

7

istream_iteratorのコンストラクターパラメーターは非定数参照であるため、そうではありませんが、一時的なものを提供します。非定数参照に一時(右辺値)を提供することはできません。

ただし、それはさておき、const参照が必要な場合でも、ifstreamはコピーできないため、機能しません。不思議なことに、C ++では、右辺値を非定数参照にバインドするために、アクセス可能なコピーコンストラクターが必要です。

于 2010-05-06T16:54:54.550 に答える
2

ストリームは非const参照によって渡されますが、一時的なものはconst-referenceによってのみ渡されます。

ストリームで行うほとんどすべてのことでストリームの状態が変更される可能性があるため、ストリームは基本的に常に非定数参照によって渡されます。

于 2010-05-06T16:56:04.510 に答える