c++ - 成员函数交换背后的基本原理

标签 c++ language-lawyer swap generic-programming

在标准库中,如果类类型有专门的交换算法,那么它将有一个成员函数 swap 和一个自由函数 swap成员函数。我不太明白同时拥有它们(因此代码重复)背后的基本原理,而不仅仅是免费功能之一。请注意,当我说自由函数时,我指的是专门的自由交换函数,而不是通用的 std::swap 函数模板。这样一个专门的函数可以通过成为它的友元来特权访问相关类。

我有两点支持只留下自由函数而不是成员函数。首先,它形成了一个更通用的交换接口(interface),以方便编写通用算法,因为数组等非类类型不能有成员函数。其次,交换是涉及两个操作数的二元运算,并表现出对称感。使用对任一操作数都没有偏差的自由函数来执行交换更加自然和直观。为此,我在使用成员函数swap时总觉得有些奇怪,就好像我在执行一些基于调用对象的操作。

最佳答案

自由函数看不到类的私有(private)内容,因此实际功能需要作为类成员提供。但是,您需要免费功能,因为它是一个自定义点(使用 ADL);因此通用算法将调用免费的 swap 以实现适合手头类型的任何交换。

成员函数对于像 T().swap(existing_thing) 这样的构造也很有用,因为自由函数需要左值参数。

我想另一种方法是使 swap 成为类内部声明的公共(public)友元函数,也可以通过 ADL 找到它。

关于c++ - 成员函数交换背后的基本原理,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/33066748/

相关文章:

c++ - 根据标准,这种没有破坏的交换实现是否有效?

c++ - 重载一元运算符 &

c++如何防止函数参数评估

C++ 错误 : Cannot convert 'Object' to 'Object*'

c - 结构的陷阱表示

hibernate - 如何在 Ubuntu 18.04 中 hibernate

c++ - 为什么 opengl 着色器没有编译?

包含文件中的#endif 是否可以用于关闭包含文件中的#if?

c++ - 使用 %s 调用 printf 并传递一个零长度的 char* 是未定义的行为吗?

c - 需要就地反转文件,但它只适用于一行文件