簡體   English   中英

私有繼承和 ADL 交換

[英]Private inheritance and ADL swap

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

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM