Армянское Радио, ну, получается так. Своп через копирование: передача по ссылкам, временный объект, конструктор копирования (const &), оператор назначения копирования(const &). А вот своп через перемещение пока не понимаю.
Qubc, ссылка - это значение с категорией lvalue-reference. Для перемещения требуется выражение с категорией prvalue. Счастливым совпадением(нет) является то, что выражения с категорией glvalue, коим являются и выражения с категорией lvalue, могут использоваться для инициализации выражений с категорией prvalue даже неявно.
Поэтому размен состояний через перемещение - это самый эффективный размен состояний. Swap через копирование - это решение для времен до C++11.
mayton2019, Можно. Но это не помена значений на месте. Чтобы поменять значения, надо будет еще эту пару назад присвоить, и это будет 2 временные пересенные (в паре), вместо одной.
mayton2019, Так-то и свап с аргументами-ссылками может быть лямбдой. Правда, зачем кому-то может понадобится лямбда, меняющая местами 2 аргумента, я не могу представить. Особенно, лямбда, которая возвращает аргументы в паре. Этакий make_pair, но переставляющий элементы.
В таком узком варианте - наверное нет. Просто функция всегда лучше когда она имеет аргументы и результат. Ее можно тестировать по другому. В данном случае тест вроде property based.
swap(swap(a,b)) = pair(a,b)
Ее можно использовать в рекурсии (обработка деревьев).
Можно попробовать сделать функцию которая возвращает пару.
Идиома swap означает именно фактический размен состояний между аргументами.
Возвращающая пару функция будет фрустрировать пользователей. Этого точно делать не надо.
В ответе приведена правильная типовая реализация swap, использующая третий объект.
Я понимаю. Я реализовывал эту идеому на Borland C++ а спустя много лет я получил на собеседовании вопрос как реализовать swap на Java. Вот это заставляет задуматься. Вообще swap достоин отдельного топика.
Но это все таки не функция. Я с этим согласен. Ближе к некому макросу языка.