其他分享
首页 > 其他分享> > c – 在基于范围的for循环中使用转发引用有什么好处?

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