在 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/

10-12 23:59