c – 返回值或右值引用?

前端之家收集整理的这篇文章主要介绍了c – 返回值或右值引用?前端之家小编觉得挺不错的,现在分享给大家,也给大家做个参考。
在斯科特·迈耶(Scott Meyer)的新书中,他提出了一个如下所示的rvalue引用限定词的示例用法
class Widget {
private:
    DataType values;

public:
    DataType& data() &  { return values; } 
    DataType  data() && { return std::move(values); } // why DataType?
};

以便:

auto values = makeWidget().data();

move-construct值而不是复制构造值.

为什么rvalue-ref-qualified data()返回DataType而不是DataType&?在这种情况下,auto仍然会推导出DataType(尽管decltype(auto))不会 – 但是不能仅仅是选择返回值而不是ravlue ref的原因. This高投票答案返回一个rvalue ref,这对我来说更概念化.

解决方法

DataType data() && { return std::move(values); } // why DataType?

auto values = makeWidget().data();

保留返回值的临时值将通过move-constructor进行初始化,从move(values)复制初始化.

那么临时初始化值,但是由于makeWidget().data()是一个rvalue(prvalue是精确的),move-constructor被再次调用 – 以临时为参数.

现在考虑copy-elision

When a nameless temporary,not bound to any references,would be moved
or copied into an object of the same cv-unqualified type,the
copy/move is omitted. When that temporary is constructed,it is
constructed directly in the storage where it would otherwise be moved
or copied to. When the nameless temporary is the argument of a return
statement,this variant of copy elision is known as RVO,“return value
optimization”.

所以第二个举动(大概)会被完全消除,只剩下一个,反正我们还是有一个这样的回归类型.

返回值引用的问题是如果我们写

auto&& values = makeWidget().data();

值将悬挂,因为将xvalue绑定到引用不会延伸任何一生的寿命.当我们返回对象类型时,会延长临时生存期.

猜你在找的C&C++相关文章