Передача нестандартного типа по ссылке
Впервые за долгое время столкнулся со следующим явлением: когда я создаю свой тип и пытаюсь его передать по ссылке, например, в функцию. То появляется следующая ошибка: error: cannot bind non-const lvalue reference of type ‘тип&’ to an rvalue of type ‘тип’
Вот пример кода:
#include <iostream>
using namespace std;
typedef long int li;
void foo(int &i){i = 10;}
int main()
{
li i=0;
foo(i);
cout << "i: " << i << endl;
return 0;
}
Но если, я изменю на тип, на который объявил я, то ошибок не будет
typedef long int li;
void foo(li &i){i = 10;}
Или преобразую к ссылке на тип, то ошибок тоже не будет
typedef long int li;
void foo(int &i){i = 10;}
int main()
{
...
foo((int&)i);
...
}
Поискал в интернете и не смог ничего найти, кроме гениальных комментариев от прирождённых программистов, что ссылку надо превратить в const ссылку, короче опустим оскорбления обделенных умом людей. Если кто может, дайте пожалуйста ссылки на статьи, которые объясняют, что происходит в этом случае и какие еще есть способы преодолеть эту ошибку.
Ответы (1 шт):
Ссылка — это "под капотом" по сути адрес. Передавая вместо ссылки на один тип переменную другого, вы нарушаете корректность обращения к переменной в памяти.
Например, если размер long int - 8 байт, а int - 4 байта, то при такой передаче вы просто запишете только 4 байта... Вот, смотрите - https://ideone.com/9iRh7s - произошла запись только половины переменной.
Так что первый путь — с указанием правильного типа — корректен. А вот второй — с приведением к типу ссылки на другой тип — приводит к неверному обращению в памяти, что ни к чему хорошему привести не может по определению :(