Подтвердить что ты не робот

Почему нельзя перемещать 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 перемещаться самостоятельно?

4b9b3361

Ответ 1

Первоначально они были подвижными. Это оказалось ошибкой дизайна с моей стороны и обнаружено Альберто Ганешем Барбати:

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

Проблема показывает несколько примеров, когда ostream перемещается и/или заменяется, и результаты удивляют, а не ожидаются. Я был убежден, что эти типы не должны публично перемещаться и не поддаваться замене по этому вопросу.