为什么不能std :: ostream被移动?
显然,stream不能被复制。 应该有可能移动stream。 根据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
,例如,有一个工厂函数创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不应该公开移动,也不应该由这个问题交换。