14 November 2022

C++ 核心指南目录

C.83: For value-like types, consider providing a noexcept swap function

理由

swap 可用来方便的实现多种常用操作,比如快速地移动对象,赋值操作。 swap 能够确保功能的确定性,减少代码调用错误。

在拷贝构造函数中考虑使用 swap 实现赋值操作。

例子

class Foo {
public:
    void swap(Foo& rhs) noexcept
    {
        m1.swap(rhs.m1);
        std::swap(m2, rhs.m2);
    }
private:
    Bar m1;
    int m2;
};

在你自定义类的名字空间下实现一个非成员的 swap 函数可以方便函数调用使用。

void swap(Foo& a, Foo& b)
{
    a.swap(b);
}

强化

  • 可拷贝类型须提供一个 swap 成员函数或外部的 swap 函数重载
  • (简单)当一个类有 swap 成员函数时,应该声明为 noexcept