Когда именно возвращается ссылка на const? - PullRequest
0 голосов
/ 12 июня 2019

Допустим, у меня есть функция, возвращающая целое число по константной ссылке:

const int& five()
{
    return 5;
}

Я знаю, что не должен возвращать значение по ссылке (const или иным образом), область видимости которого находится только внутри функциино мне просто любопытно

Как можно использовать функцию return как lvalue, как это?

int sum = 4 + five();

1 Ответ

2 голосов
/ 12 июня 2019

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

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


Может быть, стоит отметить, что временные объекты возвращаются значением дожить до конца полного выражения.Так для следующего кода:

struct Test
{
    Test() { std::cout << "Test constructed\n"; }
    ~Test() { std::cout << "Test destroyed\n"; }
};

std::ostream& operator<<(std::ostream& os, const Test& t) {
    os << "Test output";
    return os;
}

Test func() {
    return {};
}

int main() {
    std::cout << func() << "\nAfter\n";
}

Вывод будет следующим:

Test constructed
Test output
After
Test destroyed

Поскольку объект Test, возвращаемый func, живет до концаполного cout выражения.

...