在基于范围的for循环中使用转发引用有什么好处?const auto&如果我想执行只读操作就足够了。但是,我已经碰到了for (auto&& e : v) // v is non-const最近几次。这让我想知道:在某些模糊的角落情况下,使用转发引用是否有一些性能优势,与auto&或相比const auto&?(shared_ptr是一个晦涩角落案件的嫌疑人)
3 回答
牛魔王的故事
TA贡献1830条经验 获得超3个赞
我能看到的唯一优势是当序列迭代器返回一个代理引用时,你需要以非const方式对该引用进行操作。例如考虑:
#include <vector>int main(){ std::vector<bool> v(10); for (auto& e : v) e = true;}
这不会编译,因为vector<bool>::reference
从iterator
将返回的rvalue 不会绑定到非const左值引用。但这会奏效:
#include <vector>int main(){ std::vector<bool> v(10); for (auto&& e : v) e = true;}
所有这一切,除非你知道你需要满足这样一个用例,否则我不会这样编码。即我不会无偿地这样做,因为它确实让人们想知道你在做什么。如果我这样做了,那么为什么包括评论也不会有什么坏处:
#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;}
编辑
我的最后一个案例应该是一个有意义的模板。如果你知道循环总是处理代理引用,那么auto
就可以了auto&&
。但是当循环有时处理非代理引用和有时代理引用时,我认为auto&&
它将成为首选的解决方案。
慕沐林林
TA贡献2016条经验 获得超9个赞
我几乎总是使用auto&&
。当你不需要时,为什么会被边缘情况所困扰?键入也更短,我发现它更透明。当你使用时auto&& x
,你就知道每次x
都是这样*it
。
- 3 回答
- 0 关注
- 612 浏览
添加回答
举报
0/150
提交
取消