C++ 为什么不允许复制stringstream?

C++ 为什么不允许复制stringstream?,c++,stringstream,C++,Stringstream,我找不到无法复制stringstream的原因。您能提供一些参考吗?要直接回答这个问题,您不能复制,因为stringstream类的复制构造函数声明为private 可能是这样声明的,因为在大多数情况下复制流似乎很困难,因此流类中没有一个具有公共复制构造函数。 < P>复制C++中的任何流都是通过复制构造函数私下< /代码>来禁用的。 “任何”是指任何,无论是stringstream、istream、ostream、iostream还是其他 复制流被禁用,因为它没有意义。理解流的含义非常重要,真

我找不到无法复制stringstream的原因。您能提供一些参考吗?

要直接回答这个问题,您不能复制,因为stringstream类的复制构造函数声明为private


可能是这样声明的,因为在大多数情况下复制流似乎很困难,因此流类中没有一个具有公共复制构造函数。

< P>复制C++中的任何流都是通过复制构造函数<代码>私下< /代码>来禁用的。 “任何”是指任何,无论是
stringstream
istream
ostream
iostream
还是其他

复制流被禁用,因为它没有意义。理解流的含义非常重要,真正理解为什么复制流没有意义<代码>流不是可以复制的容器。它不包含数据

如果列表/向量/地图或任何容器是一个桶,那么流就是一条数据流经的软管。把流想象成获取数据的管道;管道-一边是源(发送器),另一边是接收器(接收器)。这被称为单向流。还有双向流,数据通过双向流在两个方向上流动。那么复制这样的东西有什么意义呢?它根本不包含任何数据。它是你获取数据的途径

现在假设一段时间,如果允许复制流,那么您创建了一个
std::cin
的副本,它实际上是输入流。假设复制的对象是
copy\u cin
。现在扪心自问:当已经从
std::cin读取了相同的数据时,从
copy\u cin
流读取数据有意义吗?
没有意义,因为用户只通过键盘(或输入设备)输入了一次数据只生成一次电信号,它们只通过所有其他硬件和低级API一次。您的程序如何读取两次或更多

因此,不允许创建副本,但允许创建引用:

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

还请注意,您可以创建流的另一个实例,并使其使用旧流当前使用的相同底层缓冲区。请参见:

如上所述,您无法复制流,但如果需要,您可以复制数据:

std::istream  copy_cin = std::cin; //error
std::istream & ref_cin = std::cin; //ok
std::stringstream from;
std::stringstream-to;
std::copy(std::istream\u迭代器(from),std::istream\u迭代器(),
std::ostream_迭代器(to));

如果您不知道这一点,您可以使用std::stringstream s2(s1.str())有效地实现副本@Space:我认为这样更合适:
std::stringstream s2;s2@GManNickG这不是性能更低吗?@StanE:比……什么?比之前的评论好吗?我不这么认为。你需要测量才能确定。@StanE:唯一确定的方法就是测量。:)实际上,
ios\u base
的复制构造函数是私有的,这意味着任何流都是不可压缩的。@davka:缓冲区当然是共享的。“hose”这个比喻很好,但是我放进std::stringstream的数据在哪里呢?必须有一个默认的bucket连接到该软管,因为我可以通过执行例如std::stringstream::str()来获取该bucket的内容。我看不出您所说的迭代器和流有什么不同,但是您可以复制迭代器,但不能复制流。@Mehrdad:迭代器的设计基于指针语义(指针是迭代器,记得吗?). 这就是为什么迭代器是可复制的,因为指针是可复制的!您仍然可以有选择地禁用某些类别的迭代器(比如输入迭代器)的复制,但这会给设计带来复杂性和不一致性。例如,随机访问迭代器(如指针)也是输入迭代器。我完全理解迭代器为什么是可复制的,我不是在问或抱怨。我是说,流可以完全相同的方式复制,结果完全相同,但它们不是。。。这意味着您的答案可能是错误的,因为没有真正的理由说明它们在复制时不能具有与指针相同的语义。为什么不使用s2.str(s1.str())?
std::stringstream from;
std::stringstream to;

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