Возвращает ли ссылка на локальный объект неопределенное поведение при инициализации копирования? - PullRequest
0 голосов
/ 07 июня 2018

Рассмотрим следующий код:

struct foo
{
    foo(foo const&) = default;  // To make sure it exists
};

foo& get_local_foo_reference()
{
    foo my_local_foo;
    return my_local_foo;  // Return a reference to a local variable
}

int main()
{
    foo my_foo = get_local_foo_reference();
}

Теперь все согласятся, что возвращение ссылки на локальную переменную - это плохо и ведет к неопределенному поведению.

Но в случае copy initialization (как показано в приведенном выше коде) аргумент является константной ссылкой lvalue, поэтому это должна быть ссылка инициализации аргумента, которая продлевает время жизни ссылки.

Это допустимо, или это все еще неопределенное поведение?

Ответы [ 2 ]

0 голосов
/ 07 июня 2018

Увеличение продолжительности жизни применимо только к временным значениям, когда привязка к константной ссылке или эталонному значению r.(временное не может быть привязано к неконстантной ссылке на l-значение)

Даже если вы вернете временное значение, это будет UB:

const foo& create_foo() { return foo{}; } // Also UB

С http://eel.is/c++draft/class.temporary#6.10:

Время жизни временной привязки к возвращенному значению в операторе возврата функции не продлено;временное уничтожается в конце полного выражения в операторе возврата.

0 голосов
/ 07 июня 2018

Увеличение продолжительности жизни распространяется только на временных (и их подобъектов) .my_local_foo не является временным.

...