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

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

const auto&如果我想执行只读操作就足够了。但是,我已经碰到了

for (auto&& e : v)  // v is non-const

最近几次。这让我想知道:

在某些模糊的角落情况下,使用转发引用是否有一些性能优势,与auto&或相比const auto&

shared_ptr是一个晦涩角落案件的嫌疑人)


MYYA
浏览 613回答 3
3回答

牛魔王的故事

我能看到的唯一优势是当序列迭代器返回一个代理引用时,你需要以非const方式对该引用进行操作。例如考虑:#include&nbsp;<vector>int&nbsp;main(){ &nbsp;&nbsp;&nbsp;&nbsp;std::vector<bool>&nbsp;v(10); &nbsp;&nbsp;&nbsp;&nbsp;for&nbsp;(auto&&nbsp;e&nbsp;:&nbsp;v) &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;e&nbsp;=&nbsp;true;}这不会编译,因为vector<bool>::reference从iterator将返回的rvalue&nbsp;不会绑定到非const左值引用。但这会奏效:#include&nbsp;<vector>int&nbsp;main(){ &nbsp;&nbsp;&nbsp;&nbsp;std::vector<bool>&nbsp;v(10); &nbsp;&nbsp;&nbsp;&nbsp;for&nbsp;(auto&&&nbsp;e&nbsp;:&nbsp;v) &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;e&nbsp;=&nbsp;true;}所有这一切,除非你知道你需要满足这样一个用例,否则我不会这样编码。即我不会无偿地这样做,因为它确实让人们想知道你在做什么。如果我这样做了,那么为什么包括评论也不会有什么坏处:#include&nbsp;<vector>int&nbsp;main(){ &nbsp;&nbsp;&nbsp;&nbsp;std::vector<bool>&nbsp;v(10); &nbsp;&nbsp;&nbsp;&nbsp;//&nbsp;using&nbsp;auto&&&nbsp;so&nbsp;that&nbsp;I&nbsp;can&nbsp;handle&nbsp;the&nbsp;rvalue&nbsp;reference &nbsp;&nbsp;&nbsp;&nbsp;//&nbsp;&nbsp;&nbsp;returned&nbsp;for&nbsp;the&nbsp;vector<bool>&nbsp;case &nbsp;&nbsp;&nbsp;&nbsp;for&nbsp;(auto&&&nbsp;e&nbsp;:&nbsp;v) &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;e&nbsp;=&nbsp;true;}编辑我的最后一个案例应该是一个有意义的模板。如果你知道循环总是处理代理引用,那么auto就可以了auto&&。但是当循环有时处理非代理引用和有时代理引用时,我认为auto&&它将成为首选的解决方案。

慕沐林林

我几乎总是使用auto&&。当你不需要时,为什么会被边缘情况所困扰?键入也更短,我发现它更透明。当你使用时auto&& x,你就知道每次x都是这样*it。
打开App,查看更多内容
随时随地看视频慕课网APP