Очевидно, что потоки не могут быть скопированы. Должно быть возможно перемещать потоки. В соответствии с пунктом 4 раздела 27.9.1.11 [ofstream.cons] можно переместить конструкцию a 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
, например, чтобы иметь функцию factory, создающую std::ofstream
, std::ostringstream
или какой-либо другой поток в соответствии с протоколом URN, переданным как аргумент, не работает. std::ostream
(ну, действительно, шаблон класса std::basic_ostream
) имеет конструктор перемещения protected
в соответствии с 27.7.3.1 [ostream].
Почему нельзя std::ostream
перемещаться самостоятельно?