web-dev-qa-db-ja.com

stringstreamのコピーが許可されないのはなぜですか?

int main()
{
   std::stringstream s1("This is my string.");
   std::stringstream s2 = s1; // error, copying not allowed
}

Stringstreamをコピーできない理由を見つけることができませんでした。いくつかの参照を提供できますか?

56
user756327

C++でのANYストリームのコピーは、コピーコンストラクターprivateを作成することによって無効になります。

Anyは、stringstreamistreamostreamiostreamなどに関係なく、すべてを意味します。

streamのコピーは意味がないため無効になっています。 streamの意味を理解し、streamをコピーしても意味がない理由を実際に理解することは非常に重要です。 streamは、コピーを作成できるコンテナではありません。データは含まれていません。

リスト/ベクター/マップまたはコンテナーがバケットの場合、ストリームはデータが流れるホースです。ストリームは、データを取得するパイプthroughと考えてください。パイプ-片側はソース(送信側)、反対側はシンク(受信側)です。これは単方向ストリームと呼ばれます。また、データが双方向に流れる双方向ストリームもあります。それでは、そのようなもののコピーを作成することには何の意味があるのでしょうか。データはまったく含まれていません。データを取得するのはthroughです。

しばらくの間、ストリームのコピーを作成することが許可されていて、実際に入力ストリームであるstd::cincopyを作成したとしましょう。コピーしたオブジェクトがcopy_cinだとします。今度は自問してみてください。まったく同じデータがcopy_cinから既に読み取られている場合にstd::cin.ストリームからデータを読み取ることは理にかなっていますか?いいえ、ユーザーがデータを一度入力しただけなので意味がありません、キーボード(または入力デバイス)は電気信号を1回だけ生成し、他のすべてのハードウェアと低レベルAPIを1回だけ通過しました。あなたのプログラムはそれをどのように読むことができますか2回以上

したがって、copyの作成は許可されていませんが、referenceの作成は許可されています。

std::istream  copy_cin = std::cin; //error
std::istream & ref_cin = std::cin; //ok

また、ストリームの別のインスタンスを作成し、古いストリームが現在使用しているのと同じ基礎となるバッファーを使用できるようにすることもできます。これを見てください: https://ideone.com/rijov

78
Nawaz

質問に直接答えるために、stringstreamクラスのコピーコンストラクターがプライベートとして宣言されているため、コピーすることはできません。

ほとんどの場合、ストリームをコピーするのは扱いにくいように思われるため、おそらくそのように宣言されたため、どのストリームクラスにもパブリックコピーコンストラクターがありません。

4

上記のようにストリームをコピーすることはできませんが、必要に応じてデータをコピーできます。

std::stringstream from;
std::stringstream to;

std::copy(std::istream_iterator<char>(from), std::istream_iterator<char>(),
          std::ostream_iterator<char>(to));
3
tvn