为什么不允许复制stringstream?
int main() { std::stringstream s1("This is my string."); std::stringstream s2 = s1; // error, copying not allowed }
我无法find为什么我不能复制stringstream的原因。 你能提供一些参考吗?
复制C ++中的任何stream是通过使复制构造函数保持private
被禁用的。
任何方式任何,无论是stringstream
, istream
, ostream
, iostream
或其他。
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_cin
stream读取数据是否有意义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));