什么时候使用 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);
这需要一个复制构造函数,这是流所没有的。
试图回答这个问题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);
这需要一个复制构造函数,这是流所没有的。