Пытаюсь дать ответ на этот вопрос текстовый файл обработки в-с давая ссылки на cplusplus.com. Я наткнулся на std::swap
-функция для потоковых типов, таких как fstream
,
Итак, мой вопрос:
Что именно является целью функции свопинга, например, для «потока», соответственно, в какой ситуации я должен его использовать?
Ссылка на Q& C ++ std :: ifstream в задаче конструктора Я знаю, что типы потоков не подлежат копированию. Ссылка на вопрос& Что такое идиома копирования и обмена? функциональность свопа, например, дано реализовать copy-конструктор, …. Так и типы потоков, имеющие swapping
-функция теперь копируется с swap
-feature -> Если так, как разработчики языка достигли этого?
Ну, неудивительно, что вы используете std::swap
для потоков, когда вы хотите обменяться потоками. Вы можете, например, использовать это для std::remove_if
все «плохие» потоки из вектора потоков (хорошо, это, вероятно, не лучший пример. Я не могу придумать лучший из моих голов).
Что касается того, как это работает: Начиная с C ++ 11, стандартные потоки конструируются с возможностью перемещения и назначаются с возможностью перемещения. Поэтому, хотя вы все еще не можете скопировать их, вы можете поменять их с помощью общей функции подкачки, например:
template <class T>
void swap (T &a, T &b) {
auto temp = std::move(a);
a = std::move(b);
b = std::move(temp);
}
Теперь наши потоки меняются местами без необходимости их копирования.
Кстати, обмен потоков не делает их копируемыми. Когда вы смотрите пример оператора копирования назначения
MyClass& operator=(const MyClass& other)
{
MyClass tmp(other);
swap(tmp);
return *this;
}
из вопроса, который вы связали, вы заметите эту строку:
MyClass tmp(other);
который требует конструктора копирования, чего нет у потоков.