为什么不允许复制stringstream?

时间:2011-05-15 19:59:14

标签: c++ stringstream

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

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

3 个答案:

答案 0 :(得分:77)

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

任何方式,无论是stringstreamistreamostreamiostream还是其他任何方式。

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

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

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

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

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

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

答案 1 :(得分:4)

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

可能是这样宣布的,因为在大多数情况下复制流看起来很尴尬,因此没有一个流类具有公共拷贝构造函数。

答案 2 :(得分:3)

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

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

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