c++ - 为什么 std::ostream 不能移动?

标签 c++ c++11 iostream

显然,流无法复制。应该可以移动流。根据 27.9.1.11 [ofstream.cons] 第 4 段,可以移动构造一个 std::ofstream (对于 std::ifstream 也是如此,std::fstreamstd::*stringstream 变体)。例如:

#include <iostream>
#include <fstream>
#include <string>

std::ofstream makeStream(std::string const& name) {
    return std::ofstream(name);
}

int main()
{
    std::ofstream out{ makeStream("example.log") };
}

尝试移动 std::ostream,例如,让工厂函数创建 std::ofstreamstd::ostringstream,或根据作为参数传递的 URN 的其他流不起作用。 std::ostream (嗯,类模板 std::basic_ostream 真的)根据 27.7.3.1 [ostream] 有一个 protected 移动构造函数.

为什么std::ostream不能自己移动?

最佳答案

最初它们是可移动的。结果证明这是我的设计缺陷,由 Alberto Ganesh Barbati 发现:

http://cplusplus.github.io/LWG/lwg-defects.html#911

该问题显示了一些 ostream 被移动和/或交换的示例,结果令人惊讶,而不是预期。我确信这些类型不应该是公开移动的,也不能通过这个问题交换。

关于c++ - 为什么 std::ostream 不能移动?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/20774587/

相关文章:

c++ - 使用 Bison-generated-compiler 编译源代码

c++ - 具有相同名称和不同模板参数的两个结构如何工作

c++ - 从命令行创建通用对象

c++ - 如何从另一个 vector 中的另一个第一个元素中减去一个 vector 中的第一个元素?

c++ - 为什么简单的C++源文件的预处理文件包含数千行代码?

c++ - 为什么std::getline()在格式化提取后会跳过输入?

c# - 重定向控制台应用程序的标准输入

c++ - 识别字符串中的 C 11 关键字(string.at() 问题)

c++ - 在 Eigen 3.1.0-alpha1 中返回稀疏矩阵

c++ - Pong - 球弹跳和碰撞检测算法