В данный момент имеется функция-член класса swap:
void Implementation::swap(Implementation& other) noexcept
{
using std::swap;
swap(this->m_number, other.m_number);
swap(this->m_string, other.m_string);
swap(this->m_vector, other.m_vector);
}
а также свободная функция swap, вызывающая Implementation::swap:
inline void swap(Implementation& lhs, Implementation& rhs) noexcept
{
lhs.swap(rhs);
}
Такая техника описана у Скотта Мейерса, а также используется в бусте.
Далее я натолкнулся на мнение, что функция-член засоряет класс, соответсвенно, убрать ее, а лучше сделать функцию swap другом класса и написать нечто такое:
class Implementation
{
public:
inline friend void swap(Implementation& lhs, Implementation& rhs) noexcept;
};
inline void swap(Implementation& lhs, Implementation& rhs) noexcept
{
using std::swap;
swap(lhs.m_number, rhs.m_number);
swap(lhs.m_string, rhs.m_string);
swap(lhs.m_vector, rhs.m_vector);
}
В объяснении приводились доводы в пользу ADL, но довольно туманно и до конца их я не понял. Объясните, пожалуйста, какая техника написания swap является сейчас наилучшей?
P.S. Еще вопрос относительно стиля: должна ли функция swap возвращать что-то, например, Implementation& или же стоит обойтись void?
Современные инструменты для криптотрейдинга: как технологии помогают принимать решения
Апостиль в Лос-Анджелесе без лишних нервов и бумажной волокиты
Основные этапы разработки сайта для стоматологической клиники
Продвижение своими сайтами как стратегия роста и независимости