Почему нельзя перемещать std:: ostream?
Очевидно, что потоки не могут быть скопированы. Должно быть возможно перемещать потоки. В соответствии с пунктом 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
перемещаться самостоятельно?
Ответы
Ответ 1
Первоначально они были подвижными. Это оказалось ошибкой дизайна с моей стороны и обнаружено Альберто Ганешем Барбати:
http://cplusplus.github.io/LWG/lwg-defects.html#911
Проблема показывает несколько примеров, когда ostream
перемещается и/или заменяется, и результаты удивляют, а не ожидаются. Я был убежден, что эти типы не должны публично перемещаться и не поддаваться замене по этому вопросу.