C++ 将复制返回的值赋给引用

C++ 将复制返回的值赋给引用,c++,function,c++11,reference,return-value,C++,Function,C++11,Reference,Return Value,在我正在开发的代码库中,我看到了很多东西,比如: std::map<int,int> m; // ...some code... const auto& p = m.find(10); 这样做是否有一些我没有看到的好处?在您展示的特定案例中;对p使用const引用没有任何好处。您不应该编写这样的代码,特别是因为迭代器是用来复制的。这种习惯可能来自于使用函数,这些函数返回对重的、不可复制的对象的const-限定引用 但它是如何工作的呢const-限定引用可延长所引用对象的生命

在我正在开发的代码库中,我看到了很多东西,比如:

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

这样做是否有一些我没有看到的好处?

在您展示的特定案例中;对
p
使用
const
引用没有任何好处。您不应该编写这样的代码,特别是因为迭代器是用来复制的。这种习惯可能来自于使用函数,这些函数返回对重的、不可复制的对象的
const
-限定引用

但它是如何工作的呢
const
-限定引用可延长所引用对象的生命周期-在某些情况下(如需更多信息,请参阅)。这些都适用于您的代码片段,即
const auto&
确保
m.find
返回的对象在
p
的范围内处于活动状态

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

最后,让我指出,这是一本关于生命周期延长的好读物。从那里:

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


您可以使用以下方法延长临时文件的生命周期

临时对象的生存期可以通过绑定到 常量左值引用或右值引用(从C++11开始)

同样值得一读的是:

这意味着

const auto& p = m.find(10);
这是一个有效的声明。这里没有未定义的行为

另一方面,在这里有一个
常量&
常量迭代器
没有任何好处


在第二种情况下

type& name = func_call()
不能通过引用来延长临时的生存期。 因此,上面的代码(即,当您在代码中使用
name
later时)调用未定义的行为


更多阅读:

迭代器可以像指针一样使用,而*迭代器可以访问数据的任何值。我的想法就像这段代码

std::multiset<T> m;
typename std::multiset<T>::const_iterator pos;
pos= m.begin();
type& name = func_call()
std::multiset<T> m;
typename std::multiset<T>::const_iterator pos;
pos= m.begin();
for(pos= m.begin(); !(pos==m.end()); ++pos)
    *pos= *pos+*pos;