4.4. 总结

C++ 中的交换功能用于实现几种重要的设计模式。其中最关键的是“复制与交换”模式,用于实现异常安全的事务操作。所有标准库容器以及大多数其他 STL 对象都提供了 swap 成员函数,该函数速度快,并且在可能的情况下不会抛出异常。需要支持交换的用户自定义类型,也应遵循相同的模式。需要注意的是,实现一个不抛出异常的 swap 函数通常需要间接层,这可能与某些优化准则相悖。

除了成员函数 swap 之外,我们还回顾了非成员 swap 函数的使用与实现。鉴于 std::swap 始终可用,并且可以作用于可复制或可移动的对象,如果某种类型存在更优的交换方式(特别是,提供了成员函数 swap 的类型),开发者也应提供一个非成员的 swap 函数重载,该重载调用其成员函数。

最后,尽管调用非成员 swap 的首选方式是不带 std:: 前缀(以利用参数依赖查找 ADL),但直接使用 std::swap 的方式虽然不推荐,却相当普遍。因此,应考虑为自定义类型提供 std::swap 模板的特化(显式特化),以确保兼容性。

下一章将深入了解 C++ 中最流行且最强大的惯用法 —— C++ 的资源管理之道。