Передача нестандартного типа по ссылке

Впервые за долгое время столкнулся со следующим явлением: когда я создаю свой тип и пытаюсь его передать по ссылке, например, в функцию. То появляется следующая ошибка: 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 шт):

Автор решения: Harry

Ссылка — это "под капотом" по сути адрес. Передавая вместо ссылки на один тип переменную другого, вы нарушаете корректность обращения к переменной в памяти.

Например, если размер long int - 8 байт, а int - 4 байта, то при такой передаче вы просто запишете только 4 байта... Вот, смотрите - https://ideone.com/9iRh7s - произошла запись только половины переменной.

Так что первый путь — с указанием правильного типа — корректен. А вот второй — с приведением к типу ссылки на другой тип — приводит к неверному обращению в памяти, что ни к чему хорошему привести не может по определению :(

→ Ссылка