Добрый день!
void func(int&); //Увеличить на 1 входящее значение
//...
func(1); //Попытка инициализировать ссылку, которая сразу же станет "битой"
Соглашусь с компилятором - написан действительно бред, но почитав книгу нашел порядок инициализации псевдонима:
- Во-первых, если необходимо, применяется преобразование типа (в нашем случае int(1))
- затем значение помещается во временную переменную
- наконец, адрес этой переменной используется в качестве инициализатора псевдонима (ссылки)
Выходит, сначала выделяется память для int(1), все могли бы жить счастливо, но объект сразу должен удалится (поскольку он временный). И поэтому компилятор заставляет описать псевдоним как константу. Там-же написано, что если сделаем так:
void func(const int&); //Увеличить на 1 входящее значение
То с константой не будет никаких проблем и не будет ничего удаляться. Суть вопроса: если не создается временный объект в данном случае, то как долго будет жить const int& в функции и почему выражение
const double& d = 1;
имеет разрешение на компиляцию