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

tot*_*oth 20 c++ gcc fstream clang c++11

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

#include <fstream>

int main()
{
    std::ofstream ofs;
    std::ofstream ofs2{std::move(ofs)};
}
Run Code Online (Sandbox Code Playgroud)

似乎没有在我试过的任何版本的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&)'
Run Code Online (Sandbox Code Playgroud)

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

请注意,之前问过一个非常类似的问题(std :: ofstream是否可以移动?)但是从那时起标准似乎发生了变化(详见 为什么不能移动std :: ostream?)使这些答案过时.当然,这些答案都没有解释为什么上面的代码不能编译.

在尝试使用容器时遇到了这个问题ofstream,因为上述情况不起作用.

vso*_*tco 18

根据标准

27.9.1.11 basic_ofstream构造函数

或者,它更多的"可读性"的版本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中修复.

  • https://gcc.gnu.org/bugzilla/show_bug.cgi?id=54316请注意,在顶部它只提到`stringstream`,但进一步说明它也适用于`ofstream`.最底层的条目是"固定为GCC 5". (2认同)