const auto&
如果我想执行只读操作就足够了。然而,我却遇到了
for (auto&& e : v) // v is non-const
最近几次。这让我想知道:
与其他方法相比,在某些模糊的极端情况下,使用转发引用是否可能会带来一些性能优势?auto&
or const auto&
?
(shared_ptr
是隐秘角落案例的嫌疑人)
Update我在我最喜欢的地方找到了两个例子:
迭代基本类型时使用 const 引用有什么缺点吗? https://stackoverflow.com/a/13057846/341970
我可以使用基于范围的 for 循环轻松迭代地图的值吗? https://stackoverflow.com/a/13087074/341970
请集中精力回答这个问题:为什么我想在基于范围的 for 循环中使用 auto&& ?
我能看到的唯一优点是当序列迭代器返回代理引用时,您需要以非常量方式对该引用进行操作。例如考虑:
#include <vector>
int main()
{
std::vector<bool> v(10);
for (auto& e : v)
e = true;
}
这不会编译,因为右值vector<bool>::reference
从返回的iterator
不会绑定到非常量左值引用。但这会起作用:
#include <vector>
int main()
{
std::vector<bool> v(10);
for (auto&& e : v)
e = true;
}
话虽如此,除非您知道需要满足这样的用例,否则我不会以这种方式进行编码。 IE。我不会无缘无故地这样做,因为它does让人们想知道你在做什么。如果我真的这么做了,添加一个关于原因的评论也没什么坏处:
#include <vector>
int main()
{
std::vector<bool> v(10);
// using auto&& so that I can handle the rvalue reference
// returned for the vector<bool> case
for (auto&& e : v)
e = true;
}
Edit
我的最后一个案例确实应该是一个有意义的模板。如果您知道循环始终处理代理引用,那么auto
也可以auto&&
。但是当循环有时处理非代理引用有时处理代理引用时,我认为auto&&
将成为首选解决方案。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)