首页 > 解决方案 > 将复制返回的值分配给引用

问题描述

在我正在处理的代码库中,我看到了很多东西,例如:

std::map<int,int> m;
// ...some code...
const auto& p = m.find(10);

参考类型pmap's返回一个迭代器而不是对find一个迭代器的引用,那么编写这样的代码有什么意义以及它是如何工作的 - 它是否在返回值上调用迭代器复制 ctor,因为它不能只引用临时的被退回,对吧?

这只是一个例子,当函数按值返回但调用者使用时,整个代码库中有许多类似的情况

type& name = func_call()

这样做有什么好处我想念的吗?

标签: c++functionc++11referencereturn-value

解决方案


在您展示的特定情况下;const对 . 使用参考没有任何好处p。您不应该编写这样的代码,特别是因为迭代器是要被复制的。这种习惯可能来自使用返回const对重的、不可复制的对象的限定引用的函数。

但它是如何工作的呢?const- 限定的引用延长了它们所引用的对象的生命周期 - 在某些情况下(更多信息请参见此处)。这些适用于您的代码段,即const auto&确保返回的对象m.findp.

无论您是否编写const auto& p = m.find(10);const auto p = m.find(10)因此对代码的工作方式没有任何影响。组件也可能相同。不仅有返回值优化(删除迭代器的任何复制),还需要p在堆栈帧中保存引用的对象。

最后,让我指出Abseil TotW #107,这是一本关于延长寿命的好书。从那里:

在引用初始化的明确情况下,您可能不应该依赖生命周期延长:它不会为您带来太多/任何性能,而且它是微妙的、脆弱的,并且容易给您的审阅者和未来的维护者带来额外的工作。


推荐阅读