为什么不能移动std :: ostream?

时间:2013-12-25 16:06:02

标签: c++ c++11 iostream

显然,无法复制流。应该可以移动流。根据27.9.1.11 [ofstream.cons]第4段,可以移动构造std::ofstreamstd::ifstreamstd::fstreamstd::*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::ofstreamstd::ostringstream或其他流的工厂函数不起作用。 std::ostream(实际上,类模板std::basic_ostream)根据27.7.3.1 [ostream]有一个protected移动构造函数。

为什么std::ostream无法自行移动?

1 个答案:

答案 0 :(得分:56)

最初他们是可移动的。这对我来说是一个设计缺陷,由Alberto Ganesh Barbati发现:

http://cplusplus.github.io/LWG/lwg-defects.html#911

该问题显示了移动和/或交换ostream的一些示例,结果令人惊讶,而非预期。我确信这些类型不应该是公开移动的,也不应该通过这个问题进行交换。