Почему мы не можем вернуть объект по ссылке из функции в C ++? - PullRequest
0 голосов
/ 04 декабря 2018

Что я понял, причина в том, что мы без необходимости вызываем конструктор копирования для простого утверждения, такого как a=b; (оба являются объектами).

Чего я не понимаю, так это того, что в моей книгенаписано, что мы никогда не должны передавать объект по ссылке, потому что, как только функция завершается, эта ссылка перестает существовать.

Так что текст, написанный в моей книге, неверен или я что-то здесь упускаю? Текст ref: Перегрузка оператора присваивания в C ++

Ответы [ 2 ]

0 голосов
/ 04 декабря 2018

Как только функция завершена, все объявленные в ней объекты уничтожаются.Поэтому, возвращая ссылку из функции, вы рискуете получить вызов удаленного объекта.Давайте рассмотрим типичный пример:

// don't do that!!!
std::string& get_str()
{
    std::string s = "abc";
    return s;
}


int main()
{
    string &s = get_str();
    // "abc"-string already destoyed at this moment
    std::cout << s; // attempt to deleted string: undefined behavior
}

Следовательно, опасно возвращать ссылки на локальные объекты из функций, поскольку это может включать доступ к удаленному объекту (неопределенное поведение).Хотя технически возврат объекта (не локальный) ссылка возможна и часто используется.Например:

std::string& get_s()
{
    static std::string s = "abc";
    return s;
}
int main()
{
    std::string &s = get_s();
    std::cout << s; // that's OK
}
0 голосов
/ 04 декабря 2018

Нет ничего плохого в возврате ссылки из функции.

Действительно, именно так обычно определяется оператор присваивания operator=return *this; для объединения методов)!

Чего не следует делать, так это возвращать ссылку на объект, выходящий за рамки, например,

int& undefinedBehaviourServer()
{
    int ub;
    return ub;
}

В этом случае ub имеет длительность автоматического хранения и возвращаемая ссылка на него будет болтаться .

...