私有继承和ADL交换

时间:2017-01-19 20:54:00

标签: c++

我有一个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));
    }
};

这是否正常?

1 个答案:

答案 0 :(得分:1)

  

这是否正常?

通过电话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));
}