- swap 函数交换两个对象的状态。调用 swap 后,对象本身应保持不变,除了它们访问时所使用的名称。
- swap 通常用于提供提交或回滚语义的程序中;首先创建结果的临时副本,仅在未检测到错误时才将其交换到最终目标位置。
- 使用 swap 提供提交或回滚语义的前提是,swap 操作本身不会抛出异常或以其他方式失败,从而导致交换的对象处于未定义状态。
- 应始终提供非成员 swap 函数,以确保对非成员 swap 的调用能正确执行。也可以提供成员 swap 函数,原因有二 —— 首先,这是与临时对象交换的唯一方式;其次,swap 的实现通常需要访问类的私有数据成员。如果同时提供了两者,非成员函数应调用其中一个参数的成员 swap 函数。
- 所有 STL 容器和一些其他标准库类都提供了成员函数 swap()。此外,非成员的 std::swap() 函数模板对所有 STL 类型都有标准重载。
- std:: 限定符会禁用参数依赖查找(ADL),强制调用默认的 std::swap 模板实例化,即使类中已实现了自定义的 swap 函数也是如此。为避免此问题,建议同时提供 std::swap 模板的显式实例化。