Вы можете получить int
от double
, но вы не можете получить int&
от double
.
В двух словах, здесь происходит следующее. Здесь:
void foo(int x) {}
double y = 5.0;
foo(y);
y
- это не int
, но double
можно преобразовать в int
, так что в основном у вас есть это (не совсем, но только для иллюстрации):
double y = 5.0;
int temp = y;
foo(temp);
Временный int
передается в функцию. Теперь, если функция берет ссылку, вы не можете сделать
void bar(int& X) {}
bar(5);
, потому что вы не можете связать 5
с неконстантной ссылкой. Что бы это значило? Вы не можете изменить значение 5
. Точно так же int
, полученный в результате преобразования из double
выше, является только временным, и передача его в качестве неконстантной ссылки не имеет смысла. Опять же, это не совсем то, что происходит, но это иллюстрирует «проблему»:
void bar(int& X) {}
double y = 5.0;
int temp = y;
bar(temp);
bar
изменит temp
, но это не повлияет на y
. Поскольку это не совсем то, как работает преобразование (у вас нет int temp=y;
явно в вашем коде), компилятор запрещает вам также делать
double y = 5.0;
bar(y);
PS Подумайте о том, как это сбивает с толку быть, если что-то подобное будет разрешено:
void half(int& x) { x /= 2; }
double x = 3.2;
half(x);
Что такое x
сейчас? 1.6
? 1
? Преобразование из double
в int
не проблема, но как бы вы вернули double
? Очевидно, что если допустить что-то подобное, это вызовет больше путаницы, чем поможет.
PPS swap
- это не функция, которую вы должны написать. Вместо этого используйте std::swap
.