c++ - 什么时候对流类型使用 std::swap?

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

试图回答这个问题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/

相关文章:

c++ - 如何迭代一个int数组?

c++ - 如何使我的 uninitialised_allocator 安全?

c++ - 链表上的混淆

c++ - 主流 C++ 编译器中 GC 实现的时间表是什么?

c - stderr 和 stdout - 未缓冲与缓冲?

c++ - 自定义数据 iostream

c++ - 在 windows eclipse 中使用 DGEMM BLAS

c++ - Boost MPI 在监听列表时不释放资源?

Scala如何获得流的最后计算值?

python - clang.cindex.Libclang错误 "Undefined symbol clang_CXXRecord_isAbstract"