Путаница о указателях и ссылках в С++

У меня есть куча кода вроде этого:

#include <iostream>
using namespace std;

void swap(int *a, int *b) {
    int temp = *a;
    *a = *b;
    *b = temp;
}

int main() {

    int a;
    int b;
    a = 7;
    b = 5;
    swap(a, b);
    cout << a << b;

    return 0;
}

Этот код выполняет процесс подкачки как то, что я хотел бы обменять на 2 числа

Но когда я хочу два числа от пользователя следующим образом:

int a;
int b;
cin >> a;
cin >> b;
swap(a, b);
cout << a << b;

Компилятор дает мне ошибку о целочисленной ошибке * integer, которая как и ожидалось. Почему первый код выполняет правильную замену, хотя я не использовал метод с оператором &?

Ответ 1

В первом примере вызывается std::swap из-за вашего using namespace std. Второй пример точно такой же, как и первый, поэтому вы, возможно, не используете.

В любом случае, если вы переименуете свою функцию на my_swap или что-то в этом роде (и измените каждое ее появление), то первый код не должен работать, как и ожидалось. Или удалите using namespace std и вызовите std::cin и std::cout явно. Я бы порекомендовал второй вариант.