微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

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绑定到引用不会延伸任何一生的寿命.当我们返回对象类型时,会延长临时生存期.

原文地址:https://www.jb51.cc/c/113257.html

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。

相关推荐