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;