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

Why can't I move std::ofstream?

查看之前关于 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? ) 使这些答案过时。当然,这些答案中的 none 解释了为什么上面的代码无法编译。

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

按照标准

27.9.1.11 basic_ofstream constructors

或者,它的更多 "readable" 版本 http://en.cppreference.com/w/cpp/io/basic_ofstream/basic_ofstreamstd::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 中修复。