为什么不允许复制字符串流
Why copying stringstream is not allowed?
int main()
{
std::stringstream s1("This is my string.");
std::stringstream s2 = s1; // error, copying not allowed
}
我找不到为什么我不能复制字符串流的原因。 你能提供一些参考吗?
通过使复制构造函数private
来禁用C++中任何流的复制。
意味着任何,无论是stringstream
,istream
,ostream
,iostream
还是其他什么。
流复制被禁用,因为它没有意义。理解流的含义,真正理解为什么复制流没有意义,这一点非常重要。 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));
- 使用 strcpy_s 将字符串复制到字符*
- 在这种情况下,使用 string_view 是否会导致不必要的字符串复制?
- 无法使用 strcpy 将字符串复制到静态结构成员
- 我的 c 字符串复制函数正在损坏其他变量的堆栈
- 将 C 样式字符串复制到免费存储上分配的内存中
- strcpy_s将超过字符串长度的字符串复制到目标缓冲区(用 0xFE 填充)
- 将字符串复制到类中的常量字符
- 使用 copy_if 复制 std::字符串(复制到另一个字符串中)
- 将字符串复制到C 中的另一个字符串并打印其字符
- Linux/C++ 将字符串复制到剪贴板
- 将字符串复制到 char* 的现代C++方法
- 从一个字符串复制到另一个字符串并粘贴到新文件中
- 如何才能将字符串复制到带有 std::string 字段的结构中
- 如何将数字列表从字符串复制到C++向量
- 通过指针将字符串复制到结构
- 如何将包含多个空字符的字符串复制到字符串流
- 为什么我不能从字符串复制初始化字符串流?
- 如何做字符串::复制C++的反义词
- 即使在将新字符串复制到现有字符串之后,旧包含也可用(在某些索引中)
- c无法将字符串复制到文件中