尝试回答此问题text-file-handling-in-c,提供对cplusplus.com的引用。我遇到了像std::swap
这样的流类型的fstream
- 函数。
所以我的问题是: 交换功能的目的究竟是什么,例如对于'fstream'分别在哪种情况下我必须使用它?
参考Q& A C++ std::ifstream in constructor problem我知道流类型是不可复制的。参考Q& A What is the copy-and-swap idiom?交换功能是例如。给予实现一个拷贝构造函数,....具有swapping
功能的流类型现在可以使用swap
- 功能 - >进行复制。如果是这样,语言开发者如何实现它呢?
答案 0 :(得分:1)
嗯,毫不奇怪,当您想要交换流时,可以使用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;
}
from the question you linked,您会注意到这一行:
MyClass tmp(other);
需要一个拷贝构造函数,这是流不具备的东西。