为什么不允许复制字符串流

Why copying stringstream is not allowed?

本文关键字:字符串 复制 不允许 为什么      更新时间:2023-10-16
int main()
{
   std::stringstream s1("This is my string.");
   std::stringstream s2 = s1; // error, copying not allowed
}

我找不到为什么我不能复制字符串流的原因。 你能提供一些参考吗?

通过使复制构造函数private来禁用C++中任何流的复制。

任何

意味着任何,无论是stringstreamistreamostreamiostream还是其他什么。

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

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

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

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

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

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

若要直接回答这个问题,不能复制,因为字符串流类的复制构造函数声明为私有。

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

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

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