何时使用std :: swap进行流类型?

时间:2015-07-11 18:09:30

标签: c++ c++11 stream copy-constructor copy-and-swap

尝试回答此问题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 - 功能 - >进行复制。如果是这样,语言开发者如何实现它呢?

1 个答案:

答案 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);

需要一个拷贝构造函数,这是流不具备的东西。

相关问题