【发布时间】:2014-01-13 12:06:42
【问题描述】:
显然,流无法复制。应该可以移动流。根据 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] 有一个 protected 移动构造函数。
为什么std::ostream 不能自己移动?
【问题讨论】:
-
您会将
std::ostream移动到什么位置?您需要创建派生类的实例,除非我误解了您,并且如果您在编译时不知道派生类,那么移动将如何工作? -
@hvd:我当然可以创建
std::ostream类型的对象,例如,使用std::ostream out(new std::filebuf("example.log"));(请注意,此代码需要一些工作以避免内存泄漏,但可以通过注册合适的回调)。 -
您在问题中提到了
ofstream/ostringstream,而不是直接提到了ostream。这对他们有什么作用? -
@hvd:根据您的论点,只有
final类应该是公开可移动的,而其他类型肯定不是这种情况(例如std::string或std::vector<T>尽管这可能是不明智的首先从这些类派生)。尽管霍华德发布的链接指出了其他问题,但我怀疑可能会意外切割流。 -
哦,我不是说它应该是公开移动的,也不应该是公开移动的。我是说我认为即使它可以公开移动,它也不适合你(根据你在问题中提出的内容)。