为什么我不能移动 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_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 中修复。
查看之前关于 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_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 中修复。