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

Why can't I move std::ofstream?

本文关键字:ofstream std 移动 不能 为什么      更新时间:2023-10-16

看看以前关于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&)'

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

请注意,以前也提出过类似的问题(std::of stream是可移动的吗?),但从那时起,标准似乎发生了变化(如为什么可以';t std::是否移动ostream?)使这些答案过时。当然,这些答案都不能解释为什么上面的代码不能编译。

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

根据标准

27.9.1.11基本流构造函数

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

clang++3.5用CCD_ 5或CCD_。此外,gcc5对其进行编译,因此它可能没有在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中得到解决。