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:
所以第二个举动(大概)会被完全消除,只剩下一个,反正我们还是有一个这样的回归类型. 返回值引用的问题是如果我们写 auto&& values = makeWidget().data(); 值将悬挂,因为将xvalue绑定到引用不会延伸任何一生的寿命.当我们返回对象类型时,会延长临时生存期. (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |
- 关于Sqlite多进程同时写遇到SQLITE_LOCKED的问题
- oracle11g – 在oracle 11g中查找全局数据库名称
- c – 使用调用约定fastcall的任何实际用例?
- c – _CrtCheckMemory的可靠性如何?
- SAX解析xml:SAXParseException: Content is not allowed in
- HostConfig的三种部署方法,目录部署,context.xml部署,wa
- 堆栈分配的内存与动态分配的内存
- 正则表达式 – 从相对URL确定完整URL的最快方法是什么(给定
- 如何使用swift在iOS 8中插入图像内联UILabel
- c# – 获取文件发送到回收站的日期