为了账号安全,请及时绑定邮箱和手机立即绑定

在基于范围的for循环中使用转发引用有什么好处?

在基于范围的for循环中使用转发引用有什么好处?

C++
MYYA 2019-08-12 09:54:11
在基于范围的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>::referenceiterator将返回的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&&它将成为首选的解决方案。


查看完整回答
反对 回复 2019-08-12
?
慕沐林林

TA贡献2016条经验 获得超9个赞

我几乎总是使用auto&&。当你不需要时,为什么会被边缘情况所困扰?键入也更短,我发现它更透明。当你使用时auto&& x,你就知道每次x都是这样*it


查看完整回答
反对 回复 2019-08-12
  • 3 回答
  • 0 关注
  • 612 浏览

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信