Ссылки не восстанавливаются в C ++.Это означает, что после инициализации вы не можете переназначить их.Вместо этого любое назначение фактически включает упомянутый объект.Таким образом, в вашем коде
foo1 = bar();
std::map< std::string, std::string >& foo2 = bar();
первая строка вызывает std::map::operator=
объекта, который был передан в качестве параметра myFunc
.После этого foo1
stills ссылается на тот же объект - но его значение (например, какие элементы он содержит) может быть очень хорошо изменено.
Обратите внимание, что вторая строка - , а не задание, если когда-либо было сомнение, что это было в вашем уме.Это инициализация.Так как тип возвращаемого столбца на самом деле std::map<std::string, std::string> const&
, он не может быть привязан к std::map<std::string, std::string>&
, поэтому это ошибка компиляции.
Чтобы развернуть «философскую» сторону, ссылки на C ++разработан, чтобы быть максимально прозрачным и на самом деле не существует в виде объектов.Это использует стандартный термин C ++ для термина (он не связан с ООП): это означает, что, например, ссылочные типы имеют , а не размер.Вместо этого sizeof(T&) == sizeof(T)
.Аналогично, ссылки не имеют адресов, и невозможно сформировать указатель или ссылку на ссылку: если дано int& ref = i;
, то &ref == &i
.
Ссылки, таким образом, преднамеренно предназначены для использования в качествеесли упомянутые объекты использовались сами.Единственная вещь, относящаяся к конкретной ссылке, которая происходит во время жизни ссылки, это ее инициализация: что она может связать и что это означает с точки зрения срока службы.