2017-01-19 4 views
1

У меня есть тип Base, который в частном порядке унаследован от Derived. Derived не добавляет новых переменных-членов.Частное наследство и свод ADL

Теперь, как правильно написать своп для 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

Правильно ли это работает?

С вызовом 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)); 
} 
+0

Ах да, я ушел из ADL подкачки для 'Derived', потому что ISN напрямую связан с вопросом. Но спасибо за указание. –

Смежные вопросы