我有一招,只有结构Foo
和功能Foo get();
是否有任何理由将一个返回值作为右值引用?
如果我想捕捉的get
返回值在一个可变的方式,我有两个选择:
- 按值(
Foo
) - 通过右值引用(
Foo&&
)
当我通过右值引用创建左值捕获,很像捕获按价值。
我很努力地看到不同选项之间的点?
- 是否有任意这两个区别?
工作实施例:
#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。如果函数返回一个表示临时的xvalue,则会产生一个缺陷。 'Foo && f = std :: move(std :: string {});' –
@ m.m。是的,如果不转变为标准,这很难说得通 – Yakk