В первой программе вызывается ваша собственная своп-функция для указателей.
Во второй программе вызывается стандартная функция std::swap
для объектов типа int
из-за неквалифицированного поиска по имени и наличие директивы using.
В третьей программе (когда вы указали a
и b
) вызывается ваша собственная функция swap, которая принимает объекты типа int
по ссылке. Компилятор предпочитает использовать не шаблонную функцию, если подходят как шаблонные, так и не шаблонные функции.
Но ваша функция подкачки в четвертой программе не предназначена для замены указателей. Поэтому компилятор пытается выбрать стандартную функцию подкачки std::swap
. Но он не предназначен для обмена временными (rvalues) объектами. Таким образом, компилятор выдает ошибку.
Вы можете вызвать стандартную функцию подкачки, если вы ввели промежуточные переменные, которые будут содержать указатели на переменные a
и b
.
Вот демонстрационная программа .
#include<iostream>
using namespace std;
void swap(int &x, int &y)
{
int t;
t = x;
x = y;
y = t;
}
int main()
{
int a = 10, b = 20;
int *pa = &a;
int *pb = &b;
cout << "value of *pa before swap " << *pa << endl;
cout << "value of *pb before swap " << *pb << endl;
swap( pa, pb);
cout << "value of *pa after swap " << *pa << endl;
cout << "value of (pb after swap " << *pb << endl;
cin.get();
}
Его вывод
value of *pa before swap 10
value of *pb before swap 20
value of *pa after swap 20
value of (pb after swap 10
В этой программе ваша собственная функция swap не вызывается, поскольку ее параметры являются ссылками на объекты типа int
, но вы вызываете swap проходящие объекты (указатели) типа int *
.
Так вызывается стандартная функция std::swap
, специализированная для объектов типа int *
.
Она меняет сами указатели, а не объекты, на которые указывают указатели ..