c++ - 将复制返回的值分配给引用
问题描述
在我正在处理的代码库中,我看到了很多东西,例如:
std::map<int,int> m;
// ...some code...
const auto& p = m.find(10);
参考类型p
。map
's返回一个迭代器而不是对find
一个迭代器的引用,那么编写这样的代码有什么意义以及它是如何工作的 - 它是否在返回值上调用迭代器复制 ctor,因为它不能只引用临时的被退回,对吧?
这只是一个例子,当函数按值返回但调用者使用时,整个代码库中有许多类似的情况
type& name = func_call()
这样做有什么好处我想念的吗?
解决方案
在您展示的特定情况下;const
对 . 使用参考没有任何好处p
。您不应该编写这样的代码,特别是因为迭代器是要被复制的。这种习惯可能来自使用返回const
对重的、不可复制的对象的限定引用的函数。
但它是如何工作的呢?const
- 限定的引用延长了它们所引用的对象的生命周期 - 在某些情况下(更多信息请参见此处)。这些适用于您的代码段,即const auto&
确保返回的对象m.find
在p
.
无论您是否编写const auto& p = m.find(10);
或const auto p = m.find(10)
因此对代码的工作方式没有任何影响。组件也可能相同。不仅有返回值优化(删除迭代器的任何复制),还需要p
在堆栈帧中保存引用的对象。
最后,让我指出Abseil TotW #107,这是一本关于延长寿命的好书。从那里:
在引用初始化的明确情况下,您可能不应该依赖生命周期延长:它不会为您带来太多/任何性能,而且它是微妙的、脆弱的,并且容易给您的审阅者和未来的维护者带来额外的工作。
推荐阅读
- javascript - 如果特定键包含搜索词,则过滤对象数组
- java - 如何将多个 JSON 字符串组合成一个(Java)
- docker - Yii2 应用程序在升级到 php 7.4 并激活 opcache 后导致对等方重置连接
- html - 当 Aurelia 在 URL 中看到 # 并尝试重新路由时单击页面链接(片段标识符)时,如何阻止 Aurelia 引发 JS 错误?
- javascript - 浏览器会忽略“Accept-Encoding”标头吗?
- android - 如何为我的两个主题创建颜色状态列表?
- python - 我正在尝试检测屏幕上的移动,但出现错误:ValueError: too many values to unpack (expected 4)
- python - 使用 Pandas 过滤数据框中多列的唯一匹配
- swiftui - SwiftUI @EnvironmentObejct 似乎无法更新值
- java - 一键保存drawable文件夹中的多张图片