04 мая 2012

#3 Две маленькие особенности константных ссылок

... или «...гигант в шкуре крохи»


Ссылки предполагают очень легкую и комфортную работу. Ну, да, нельзя выделить память и переназначить на другой объект. Но не всегда это и нужно.
Всегда и во всех книгах говорилось, что ссылка всего лишь маленький псевдоним на настоящий объект. И если объекта уже нет, а ссылка всё ещё существует, то всё будет очень печально.
Но!
...
Оказывается, может быть и обратное! Представляете? Речь о константных ссылках (не константные на это не способны).

1) Константная ссылка может быть инициализирована литералом:
const int& cri = 820;
В данном случае создаётся временный объект типа int, ему присваивается значение 820, а затем ссылка инициализируется так, чтобы указывать на этот временный объект. Но погодите! Когда дойдём до точки с запятой, временный объект уничтожится! Но, не в этом случае. Ссылка не даст этого сделать; временный объект будет существовать, пока существует ссылка на него.

2) Константную ссылку можно инициализировать безымянным временным объектом. И вновь, объект будет существовать до тех пор, пока существует ссылка на него:
std::string concat(const std::string& left, const std::string& right) {
  return left + rlight;
}
const std::string& tmp = concat(std::string("Hi "), std::string("there"));

Важно понять, что это механизм самого языка и реализовать его должны все компиляторы (а делается это просто, учитывая, что ссылка — более строгий тип указателя). Это свойство не реализует механизм подсчета ссылок.




Об этом говорят специалисты: