私有继承和 ADL 交换

Private inheritance and ADL swap

本文关键字:ADL 交换 继承      更新时间:2023-10-16

我有一个类型Base,它是由Derived私下继承的。 Derived 不会添加任何新的成员变量。

现在为Derived编写交换的正确方法是什么?我们不能假设Base有一个成员swap,所以我认为也许:

class Derived : private Base {
public:
    void swap(Derived& other) noexcept
    {
        using std::swap;
        swap(static_cast<Base&>(*this), static_cast<Base&>(other));
    }
};

这工作正常吗?

这工作正常吗?

随着通话d1.swap(d2),是的。

但是,如果用户尝试编写:

using std::swap;
swap(d1, d2);

这不会叫swap(Base&, Base&),如果这是一个存在的东西,并且做了一些特别的事情。它将调用std::swap<Derived>并使用移动构造函数/赋值。

因此,另外,在Derived声明中写下:

friend void swap(Derived& d1, Derived& d2) {
    d1.swap(d2);
}

或者直接写那个:

friend void swap(Derived& d1, Derived& d2) {
    using std::swap;
    swap(static_cast<Base&>(d1), static_cast<Base&>(d2));
}