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