显然,流无法复制。可以将流移动。根据27.9.1.11 [ofstream.cons]第4段,可以移动构造一个std :: ofstream
(对于std :: ifstream
、std :: fstream
和std :: * stringstream
变体也是如此)。例如:
#include <iostream>
#include <fstream>
#include <string>
std::ofstream makeStream(std::string const& name) {
return std::ofstream(name);
}
int main()
{
std::ofstream out{ makeStream("example.log") };
}
尝试移动 std::ostream
,比如通过一个工厂函数创建一个根据传递的 URN 创建 std::ofstream
、std::ostringstream
或其他流的函数,并不起作用。实际上,std::ostream
(确切地说是类模板 std::basic_ostream
)根据 27.7.3.1 [ostream] 有一个受保护的移动构造函数。
为什么不能移动 std::ostream
自身?
std::ostream
移动到哪里?除非我误解了你的意思,否则你需要创建派生类的实例,如果你不知道派生类在编译时是什么,移动该如何进行? - user743382std::ostream
的对象,例如使用std::ostream out(new std::filebuf("example.log"));
(请注意,此代码需要一些工作来避免内存泄漏,但可以通过注册适当的回调函数来完成)。 - Dietmar Kühlofstream
/ostringstream
,而不是直接使用ostream
。它们对它们的工作方式会有什么影响? - user743382final
类应该是公开可移动的,但其他类型(例如std::string
或std::vector<T>
)显然不是这种情况,尽管最好不要从这些类派生。我怀疑意外切割流的潜在风险可能是原因,虽然Howard发布的链接指出了其他问题。 - Dietmar Kühl