Возврат ссылки на rvalue, которая передается функции в качестве аргумента - PullRequest
3 голосов
/ 07 августа 2020

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

struct Struct { int m; };

Struct& f(Struct&& rvalue)
{ 
    std::cout << &rvalue << '\n';
    return rvalue;
}

void main()
{
    Struct& lvalue1 = f(Struct{ 1 });
    std::cout << &lvalue1 << '\n';
    Struct& lvalue2 = f(Struct{ 2 });
    std::cout << &lvalue2 << '\n';

    std::cin.get();
}

Вывод:

00A3F844
00A3F844
00A3F838
00A3F838

Этот код создает разные адреса для значений r. Означает ли это, что фактическое создание объектов Struct происходит до вызова функции, и я могу безопасно делать такие вещи?

1 Ответ

3 голосов
/ 07 августа 2020

Я могу безопасно делать такие вещи?

Нет. Struct{ 1 } и Struct{ 2 } создают временные объекты , которые уничтожаются после полного выражения. Это означает, что ссылки lvalue1 и lvalue2 всегда болтаются. Разыменование на них приводит к неопределенному поведению.

Все временные объекты уничтожаются на последнем этапе оценки полного выражения, которое (лексически) содержит точку, в которой они были созданы

...