为什么不允许复制stringstream?

use*_*327 54 c++ stringstream

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

我找不到为什么我不能复制stringstream的原因.你能提供一些参考吗?

Naw*_*waz 79

通过创建复制构造函数来禁用在C++中复制任何流private.

任何方式提供任何,无论是stringstream,istream,ostream,iostream或什么的.

流的复制被禁用,因为它没有意义.了解意味着什么非常非常重要,要真正理解为什么复制没有意义.stream不是您可以复制的容器.它不包含数据.

如果列表/向量/映射或任何容器是存储桶,则流是数据流经的软管.将流视为一些管道,您可以通过它获取数据; 管道 - 一侧是源(发送器),另一侧是接收器(接收器).这称为单向流.还有双向流,数据在这两个方向上流动.那么制作这样的东西有什么意义呢?它根本不包含任何数据.您可以通过它获取数据.

如果使流的副本被允许现在,假设一段时间,并创建一个副本std::cin这实际上是输入流.说复制的对象是copy_cin.现在问问自己:从copy_cin已经从std::cin.No 读取相同数据时从流中读取数据是否有意义,这没有意义,因为用户只输入一次数据,生成键盘(或输入设备)电信号只有一次,它们只流过所有其他硬件和低级API.您的程序如何读取两次或更多次

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

std::istream  copy_cin = std::cin; //error
std::istream & ref_cin = std::cin; //ok
Run Code Online (Sandbox Code Playgroud)

另请注意,您可以创建另一个流实例,并使其可以使用旧流当前使用的相同底层缓冲区.请看:https://ideone.com/rijov

  • +1'流'是一系列管';) (8认同)
  • 我完全理解为什么迭代器是可复制的,我不是在询问或抱怨.我说流可以以完全相同的方式复制到完全相同的结果,但它们不是......这意味着你的答案可能是错误的,因为没有真正的理由为什么它们不能具有相同的语义复制指针. (4认同)
  • '软管'的比喻很好,但那时我放入std :: stringstream的那些数据到底是什么?必须有一个默认存储桶连接到该软管,因为我可以通过执行例如std :: stringstream :: str()来获取该存储桶的内容. (3认同)
  • 我没有看到你说的迭代器和流有什么不同,但你可以复制迭代器而不是流. (2认同)

Him*_*ury 4

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

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

  • 实际上,“ios_base”的复制构造函数是私有的,这意味着任何流都是不可复制的。 (16认同)