Для чего нужен возврат значения по ссылке?

Раньше я думал, что возвращение значения по ссылке от возвращения значения по указателю отличается тем, что в первом случае не нужно будет делать разыменование указателя, но, видимо, это не так. Я написал вот такой пример:
#include <iostream>

int& func(int &a)
{
    std::cout << &a << "\n\n";
    return a;
}

int main()
{
    int a;
    int b;
    b = func(a);
    std::cout << &b << "\n\n";
    std::cout << &a << "\n\n";
    return 0;
}

Я думал, что выведется три одинаковых адреса, но это не так. Если сделать возврат по значению, то результат будет идентичный. Для чего тогда вообще нужен возврат значения по ссылке?
Если мы возвращаем указатель на переменную, то в caller-е она имеет тот же адрес (мы его и вернули) и информацию по этому адресу, однако адрес указателя уже будет другим. Если мы возвращаем переменную по ссылке, то адрес у этой переменной в caller-е уже другой, такой же остаётся только информация. Почему и зачем?
  • Вопрос задан
  • 138 просмотров
Решения вопроса 1
wataru
@wataru Куратор тега C++
Разработчик на С++, экс-олимпиадник.
b = func(a);

Вот тут вы взяли ссылку, которую вернула func и скопировали значение в переменную b. Поэтому ниже &b выведет вам адрес переменной b, а не то, что вы хотели.

Возвращать ссылки бывает удобно, когда надо вернуть значение без копирования и оно всегда существует. Потому что функция, возвращающая указатель, вообще говоря, может вернуть и nullptr. По уму, надо бы этот указатель проверить перед разыменованием. А вот ссылки - они всегда куда-то указывают.
Ответ написан
Пригласить эксперта
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Войти через центр авторизации
Похожие вопросы