试图回答这个问题text-file-handling-in-c引用 cplusplus.com .我遇到了 std::swap
函数,用于像 fstream
这样的流类型。
所以我的问题是: 交换功能的确切目的是什么,例如对于“fstream”分别在什么情况下我必须使用它?
引用问答C++ std::ifstream in constructor problem我知道流类型是不可复制的。引用问答What is the copy-and-swap idiom?交换功能是例如用于实现复制构造函数,...。那么具有 swapping
功能的流类型现在是否可以使用 swap
功能进行复制 -> 如果是这样,语言开发人员是如何实现的?
最佳答案
嗯,不出所料,当您想要交换流时,您可以使用 std::swap
来处理流。例如,您可以使用它来 std::remove_if
来自流 vector 的所有“坏”流(好吧,这可能不是最好的例子。我想不出更好的一个我的头顶)。
至于这是如何工作的:从 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);
这需要一个复制构造函数,这是流所没有的。
关于c++ - 什么时候对流类型使用 std::swap?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/31360265/