在标准库中,如果类类型具有专门的交换算法,那么它将具有成员函数swap
和自由函数swap
,它们只是转发给成员函数。我不太了解它们两者的原理(因此代码重复),而不仅仅是自由函数。请注意,当我说自由函数时,我指的是专门的自由交换函数,而不是通用的std::swap
函数模板。这样一个专门的功能可以通过成为它的朋友来获得对相关课程的特权访问。
我有两点支持离开自由函数而不是成员函数。首先,它形成了一个更通用的交换接口,以便于编写泛型算法,对于非类类型,如数组不能具有成员函数。其次,swap是涉及两个操作数的二元操作,表现出对称感。使用对任一操作数没有偏差的自由函数执行交换更自然,更直观。出于这个原因,在使用成员函数swap
时,我总是觉得有些奇怪,好像我正在执行一些基于调用对象的操作。
答案 0 :(得分:3)
free函数无法看到类的私有内容,因此实际的功能需要作为类成员提供。但是,您需要自由功能,因为它是自定义点(使用ADL);因此,通用算法将调用空闲swap
,以实现适合手头类型的任何交换。
成员函数对于像T().swap(existing_thing)
这样的构造也很有用,因为自由函数需要左值参数。
我想替代方法是让swap
在类中声明为公共友元函数,也可以通过ADL找到。