Возврат ссылки lvalue вызывает закрытие? - PullRequest
0 голосов
/ 13 января 2019

Я изучаю lvalue / rvalue, и есть пример с lvalue:

int& foo();
foo() = 42; // ok, foo() is an lvalue

Обычно люди позволяют foo () возвращать глобальную переменную или статическую переменную внутри его тела, но если мы определяем локальную переменную внутри тела foo, она также работает (с предупреждением: ссылка на стековую память, связанную с локальной переменная 'i' вернула [-Wreturn-stack-address] ):

#include <iostream>
using namespace std;

int &foo(){int i=7; return i;};

int main() {

    foo() = 42;
    return 0;
}

Почему это разрешено в C ++, это закрытие?

1 Ответ

0 голосов
/ 13 января 2019

Эта программа демонстрирует неопределенное поведение при доступе к объекту после окончания срока его жизни.

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...