使用map.find()或任何返回迭代器的函数。 将返回值存储为ref有什么好处?
const auto it = map.find(0);
const auto& it2 = map.find(0);
答案 0 :(得分:1)
const auto&
循环中使用它, for
可能会有所帮助,在该循环中您还可以确定寿命:
for(const auto& it : map)
{....}
正如@ {Ted所指出的,这种for
循环形式
for(const auto& [key, value] : the_map)
{ ... }
否则,微优化(如果有的话)不值得它带来潜在的错误。
也许有一天,另一个程序员会删除const
,那么您就有了对临时目录的引用。
答案 1 :(得分:1)
有2个时刻使此方法无用:
迭代器设计为轻量级对象,可以廉价地按值传递和存储。
即使您在这种情况下有重物也不会保存任何东西。这就是为什么。
想象一下这段代码:
HeavyObject foobar();
auto obj1 = foobar();
const auto &obj2 = foobar();
在C ++的早期阶段,由于可能在第一个案例中调用copy ctor,因此第二种案例将更为理想。由于RVO(返回值优化)已经不再是这种情况了,自C ++ 17起,RVO是必需的。因此,与迭代器相比,您的代码以前对更复杂的对象有意义。在使用迭代器的情况下,即使不启用优化,甚至在未强制使用RVO的情况下,您也几乎看不到任何性能差异。因此,这样的代码可能被某些人认为不错,但是我发现它不可读,因为迭代器通常按值传递,并且至少会引发一个问题,为什么作者要这样做?