Инициализация не const-ссылки с целым значением

Пожалуйста, рассмотрите этот код:

#include <iostream>

using namespace std;

class test
{
 int& ref;
 public:
 test(int i):ref(i)
 {
 cout << "Constructor Called" << endl;
 }
 void p(){ cout<< ref << "\n";}
};

int main()
{
 test obj(5);
 obj.p();

 return 0;
}
</iostream>

Вывод:

Constructor Called
5

Сомнение: как инициализируется ссылка non-const (ref) с целым значением (5) здесь, а следующий код не выполняется:

int& r = 5;
2 ответа

конструктор test's:

test(int i)

принимает значение int как параметр по значению.

Когда вы инициализируете obj, передавая 5 его конструктору, то есть:

test obj(5);

что для параметра конструктора i установлено значение 5 (т.е.: 5 скопировано в i), то ссылка-ссылочная ref инициализируется этим параметром в списке инициализации элемента-конструктора (а не буква 5 используемого при вызове конструктора):

test(int i):ref(i)

У вас есть ссылка на привязку: ссылка ref пережитку объекта (i), на который ссылается, поскольку параметр конструктора i больше не существует после возврата конструктора.


Ссылка не инициализируется с помощью 5 напрямую, она инициализируется локальным i. Поскольку i уничтожается при выходе из конструктора, вы остаетесь с обвисшей ссылкой, которая является ссылкой, ссылающейся на объект, который вышел из области видимости. Компиляторы, такие как Clang, расскажут вам об этом, предупреждая, что может быть что-то вроде:

предупреждение: привязать <span>ссылочный</span> элемент 'ref' к стеку выделенного параметра 'i' [ <span>-Wdangling-field</span> ]

licensed under cc by-sa 3.0 with attribution.