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&...
思路如标题所说采用模N取余法,难点是这个除法过程如何实现。...
本篇博客有更新!!!更新后效果图如下: 文章末尾的完整代码...
刚开始学习模块化程序设计时,估计大家都被形参和实参搞迷糊...