Ответ 1
Ваша функция swap
не вызывается вообще.
В одну из стандартных библиотек входит включение <utility>
, которое объявляет шаблон функции с именем swap
в пространстве имен std
. Поскольку вы using namespace std;
, функция swap
вводится в глобальное пространство имен и вызывается вместо этого.
Почему вместо swap
выбрана std::swap
? Ваша функция swap
принимает два long
по значению; для вызова этой функции требуется целочисленное продвижение для каждого из аргументов int
.
std::swap
- это шаблон функции. Он принимает две ссылки на T
, и когда этот шаблон функции создается с помощью T = int
, оба аргумента являются точным совпадением. Таким образом, std::swap
лучше соответствует вашей функции и поэтому выбирается во время разрешения перегрузки.
Это одна из причин, по которой using namespace std;
является злом, и его следует избегать. Если вы удалите директиву using, ваша функция будет единственной доступной функцией, и она будет вызвана.