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

标签 c++ c++11 gcc clang fstream

查看之前关于 SO 的答案,似乎虽然 std::ostream 不可移动,但 std::ofstream 应该是。但是,这段代码

#include <fstream>

int main()
{
    std::ofstream ofs;
    std::ofstream ofs2{std::move(ofs)};
}

似乎无法在我尝试过的任何版本的 gcc 或 clang 中编译(使用 --std=c++11 或 --std=c++14)。编译器错误有所不同,但这是我从 gcc 4.9.0 得到的结果

6 : error: use of deleted function 'std::basic_ofstream::basic_ofstream(const std::basic_ofstream&)'

根据标准,这是预期的行为吗?

请注意,之前曾提出过一个非常相似的问题(Is std::ofstream movable?),但从那时起标准似乎发生了变化(详见 Why can't std::ostream be moved? ) 使这些答案过时。当然,这些答案都没有解释为什么上面的代码不能编译。

在尝试使用 ofstream 的容器时遇到了这个问题,由于上述原因,它不起作用。

最佳答案

按照标准

27.9.1.11 basic_ofstream constructors

或者,它更“可读”的版本http://en.cppreference.com/w/cpp/io/basic_ofstream/basic_ofstream , std::basic_ostream<>有一个移动构造函数,所以代码应该编译。

clang++ 3.5 用 -std=c++11 编译它或 -std=c++1y . gcc5 也编译它,所以它可能没有在 libstdc++ 中为 gcc < 5

实现

有趣的是,gcc 的 stdlibc++ 实现中没有提到缺少移动语义 https://gcc.gnu.org/onlinedocs/libstdc++/manual/status.html#status.iso.2014

https://gcc.gnu.org/bugzilla/show_bug.cgi?id=54316对于错误报告,感谢@BoBTFish 指出。已确认该问题已在 gcc5 中修复。

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

相关文章:

c - 变量的前置和后置增量操作在 TC 和 gcc 上给出不同的输出

c++ - 概念检查器无法在 gcc 上编译,因为它是 'has no linkage'

gcc - cygwin 中奇怪的无声 cc1plus 错误

c++ - 在 Qt 中正确实现自定义 QWidget

c++ - 服务器和客户端之间的同步

c++ - 将左值传递给右值

c++ - 除了使用 'extern' 关键字 :n3290 draft 之外,是否还有其他可能证明这一点

c++ - 在 vector <unique_ptr> 上使用 is_copy_constructible 误报

c++ - 在 Eclipse Ubuntu 14 中执行 Python 代码时出现 pretty-print 错误

c++ - 将 QVector 从信号传递到不同线程中的槽会导致数据复制吗?