Какие функции swap нужны для класса

246
19 ноября 2017, 16:18

В данный момент имеется функция-член класса 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?

READ ALSO
Расширение строки QListView

Расширение строки QListView

У меня есть QListView и модель для него, унаследованная от QAbstractListModelМне необходимо отображать элементы модели при помощи кастомных виджетов

283
Как получить из лямбды значение, которое она вернёт?

Как получить из лямбды значение, которое она вернёт?

Я бы хотел таким образом получить максимальный элемент field, но не понимаю, как получить возвращаемое значение

269
Pulseview build windows msys2

Pulseview build windows msys2

Пытаюсь собрать sigrok pulseview использую msys2Все время получаю ошибки или не найти хедеры или проблемы с библиотеками у линковщика, последнее что...

256
Скриншот с помощью С++

Скриншот с помощью С++

Делаю параграмму на С++ которая через интернет будет передавать скриншот рабочого стола и сохранять на другом компе

285