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

显然,stream不能被复制。 应该有可能移动stream。 根据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 ,例如,有一个工厂函数创build一个std::ofstream ,一个std::ostringstream ,或根据作为parameter passing的URN的其他stream不起作用。 std::ostream (好的,类模板std::basic_ostream真的)有一个按照27.7.3.1 [ostream] protected移动构造函数。

为什么不能std::ostream被移动本身?

原本他们是可移动的。 原来这是我的devise缺陷,由Alberto Ganesh Barbati发现:

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

这个问题显示了几个例子,其中ostream被移动和/或交换,结果是令人惊讶的,而不是预期的。 我确信,这些types不应该公开移动,也不应该由这个问题交换。