int main()
{
std::stringstream s1("This is my string.");
std::stringstream s2 = s1; // error, copying not allowed
}
我找不到为什么我不能复制stringstream的原因。你能提供一些参考吗?
答案 0 :(得分:77)
通过创建复制构造函数private
来禁用在C ++中复制任何流。
任何方式,无论是stringstream
,istream
,ostream
,iostream
还是其他任何方式。
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));