c – 在基于范围的for循环中使用转发引用有什么好处?
作者:互联网
const auto&如果我想执行只读操作就足够了.但是,我已经碰到了
for (auto&& e : v) // v is non-const
最近几次.这让我想知道:
在auto& amp; amp; amp; amp; amp; amp; amp; amp; amp; amp; amp; amp; amp; amp; amp; amp; amp; amp; amp; amp; amp; amp; amp; amp;或const auto&?
(shared_ptr是隐藏角落案件的嫌疑人)
更新
我在我的最爱中找到的两个例子:
Any disadvantage of using const reference when iterating over basic types?
Can I easily iterate over the values of a map using a range-based for loop?
请专注于这个问题:为什么我要使用auto&& amp;在基于范围的for循环中?
解决方法:
我能看到的唯一优势是当序列迭代器返回一个代理引用时,你需要以非const方式对该引用进行操作.例如考虑:
#include <vector>
int main()
{
std::vector<bool> v(10);
for (auto& e : v)
e = true;
}
这不会编译,因为从迭代器返回的rvalue vector< bool> :: reference将不会绑定到非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&& amp;将成为首选的解决方案.
标签:c,c11,performance,for-loop,move-semantics 来源: https://codeday.me/bug/20190915/1805270.html