为什么我不能移动 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&)'
根据标准,这是预期的行为吗?
请注意,以前也提出过类似的问题(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中得到解决。
- std::ofstream 作为类成员删除复制构造函数?
- C++:std::ofstream 方法 open() 在第二次迭代时擦除打开的 ifstream 文件
- 使用 auto_ptr<std::ofstream> 对象
- 当 ofstream 指针位于 std::map 中时,文件写入不会发生 C++.
- 如何将 std::ofstream& 传递给函数参数?
- 派生 std::ofstream 和重载运算符<<
- 为什么我可以在临时 std::ofstream 对象上使用"operator<<"?
- 如何在 std::ofstream 和 std::cerr 之间切换
- 为什么将字符串输出到未命名的 std::ofstream 反而给了我一个十六进制数?
- 如何使用 std::cout 或 std::ofstream 作为单个函数的输入?
- 将 boost stream_buffer 与 std::ofstream 结合使用
- 对 std::ofstream 进行空文件检查
- 将 std::ofstream 对象作为参数传递给类方法
- 为什么 std::ofstream 会在没有 std::ios_base::trunc 的情况下截断?
- std :: ofstream,覆盖错误的文件行
- std :: ofstream-没有比1023(即时冲洗)更长的缓冲字符串
- 如何超载std :: ofstream :: put()
- 返回"Cannot convert from 'std::ofstream {aka std::basic_ofstream<char>}' to bool"错误
- std::ofstream 会自动在 之后添加回车符 (CR; \r)
- 为什么 getline() 在 C++ 中不起作用?(调用'getline(std::ofstream&, std::string&)'没有匹配函数