У меня есть шаг-только STRUCT Foo
и функция Foo get();
Есть ли какая-нибудь причина для захвата возвращаемого значения как rvalue-reference?
Если я хочу, чтобы захватить возвращаемое значение get
в изменчивой манере, у меня есть два варианта:
- по значению (
Foo
) - по RValue ссылка (
Foo&&
)
Когда я захвачу с помощью RValue ссылок я создаю именующее выражение, так же, как захват по значению.
Я изо всех сил пытаюсь понять точку между различными вариантами?
- Есть любой разница между этими двумя?
Рабочий пример:
#include <iostream>
struct Foo
{
Foo(std::string s) : s(std::move(s)) {}
Foo(Foo&& f) : s(std::move(f.s)) {}
Foo(const Foo&) = delete;
Foo& operator=(const Foo&) = delete;
std::string s;
};
Foo get()
{
return Foo { "hello" };
}
int main()
{
// capture return value as l-value
Foo lv1 = get();
// move into another lvalue
Foo lv2 = std::move(lv1);
std::cout << lv2.s << '\n';
// capture return value as r-value reference
Foo&& rv1 = get();
// move into another lvalue
Foo lv3 = std::move(rv1);
std::cout << lv3.s << '\n';
return 0;
}
«Если он хранит ссылку на временное значение, его время жизни увеличивает значение». - только если возвращаемое значение является значением prvalue. Ловушка была бы, если функция возвращает значение x, обозначающее временное, например. 'Foo && f = std :: move (std :: string {});' –
@ м.м. да, это трудно сказать правильно, не переходя в стандартную – Yakk