为什么不允许复制stringstream?

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

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

复制C ++中的任何stream是通过使复制构造函数保持private被禁用的。

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

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

如果一个list / vector / map或者任何一个容器是一个桶,那么stream是一个数据stream通过的软pipe。 将stream视为通过其获取数据的某个pipe道; 一个pipe道 – 一边是源(发送者),另一边是水槽(接收器)。 这就是所谓的单向stream。 还有双向的数据stream通过这两个方向。 那么制作这样一个副本是什么意思呢? 它根本不包含任何数据。 你通过它获取数据。

现在假设有一段时间,如果允许复制stream,并且创build了一个实际上是inputstream的std::cin副本 。 说复制的对象是copy_cin 。 现在问自己:从std::cin.读取完全相同的数据时,从copy_cinstream读取数据是否有意义std::cin. 不,这是没有意义的,因为用户只input一次数据,键盘(或input设备)只产生一次电信号,只有一次stream过所有其他硬件和低级别的API。 你的程序如何读取两次或更多

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

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

另外请注意,您可以创build另一个stream实例,并可以使用旧stream当前正在使用的相同底层缓冲区 。 看到这个: https : //ideone.com/rijov

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

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

如上所述,你不能复制stream,但如果你需要你可以复制数据:

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