什么时候使用 std::swap 作为流类型?

When to use std::swap for stream types?

试图回答这个问题text-file-handling-in-c giving references to cplusplus.com。我遇到了 std::swap-function for stream-types like fstream.

所以我的问题是: 交换功能的确切目的是什么,例如对于 'fstream' 分别在什么情况下我必须使用它?

参考问答 C++ std::ifstream in constructor problem I know that stream types are non-copyable. Referencing to the Q&A What is the copy-and-swap idiom? 交换功能是例如用于实现复制构造函数,...。具有 swapping 特性的流类型现在是否可以使用 swap 特性复制 -> 如果是这样,语言开发人员是如何实现的?

嗯,毫不奇怪,当你想交换流时,你使用 std::swap 作为流。例如,您可以将它用于 std::remove_if 来自流矢量的所有 "bad" 流(好吧,这可能不是最好的例子。我想不出一个更好的例子头)。

至于这是如何工作的:从 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;
}

from the question you linked,你会注意到这一行:

MyClass tmp(other);

这需要一个复制构造函数,这是流所没有的。