在 Scott Meyer 的新书中,他提出了一个右值引用限定符的示例用法,如下所示:
class Widget {
private:
DataType values;
public:
DataType& data() & { return values; }
DataType data() && { return std::move(values); } // why DataType?
};
以便:
auto values = makeWidget().data();
移动构造
values
而不是复制构造它。为什么右值引用限定
data()
返回 DataType
而不是 DataType&&
?在这种情况下,auto
仍然会推导出 DataType
(虽然 decltype(auto)
不会 - 但这不能是更喜欢返回值而不是 ravlue ref 的唯一原因)。 This 高票答案返回一个右值引用,这对我来说在概念上更有意义。 最佳答案
DataType data() && { return std::move(values); } // why DataType?
auto values = makeWidget().data();
保存返回值的临时文件将通过移动构造函数进行初始化,从
move(values)
复制初始化。然后,临时初始化
values
,但由于 makeWidget().data()
是右值(准确地说是纯右值),再次调用移动构造函数 - 将临时作为其参数。现在考虑 copy-elision :
所以第二步(大概)将被完全省略,只剩下一个 - 我们本来应该拥有的那个,如果返回类型是右值引用。
返回右值引用的问题在于,如果我们写
auto&& values = makeWidget().data();
values
将悬空,因为将 xvalue 绑定(bind)到引用不会延长任何东西的生命周期。当我们返回对象类型时,临时生命周期会延长。关于c++ - 返回值还是右值引用?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/27368236/