Помогите разобраться с ссылками в C++

В книгах по C++ указано, что ссылка перед использованием должна быть инициализирована обьектом, на который она ссылается, в противном случае компилятор выдает ошибку:

int &link;// Ошибка`

Почему тогда, если ссылка обьявлена в качестве аргумента функции и не инициализирована обьектом, то ошибки нет?

int sum(int &a, int &b) {
    return (a + b);
}

Ответы (2 шт):

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

В комментариях уже много сказали, но стоит обобщить.

Вообще, то что вы спрашиваете немного разные вещи.

  1. Это alias(псевдоним) и тут вполне логично, что он не может не быть определен, тут . никакой путаницы нету.
  2. Это передача аргумента в функцию(по значению, по ссылке, по указателю). Другими словами это не псевдоним как было раньше, а говорит компилятору, что не нужно делать копию аргумента передаваемого в функцию, а возьми просто это по адресу в памяти. Затем, когда вы вызываете функцию и происходит инициализация и можно сказать создание псевдонима которая указывает на это место в памяти.
→ Ссылка
Автор решения: ВЛ 80

Выражаясь более-менее формальным языком, инициализация параметров функции происходит в момент её вызова с помощью аргументов, использованных в месте её вызова, либо аргументов по-умолчанию, если таковые существуют.

Ссылки без инициализации могут встречаться только в следующих случаях:

Параметры функций:

int sum(int &a, int &b);

Тип данных возвращаемых функцией:

int & get_num();

Объявление члена класса:

struct Test
{
  int & num;
};

При использовании спецификатора extern:

extern int & var;

Источник

→ Ссылка