Почему нельзя переместить 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 перемещается и / или меняются местами, и результаты неожиданные, а не ожидаемые. Я был убежден, что эти типы не должны быть публично перемещаемыми или заменяемыми этой проблемой.

Другие вопросы по тегам