gpt4 book ai didi

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

转载 作者:塔克拉玛干 更新时间:2023-11-03 07:57:12 25 4
gpt4 key购买 nike

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

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

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

auto&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?

请专注于以下问题:为什么我要在基于范围的 for 循环中使用 auto&&?

最佳答案

我能看到的唯一优势是当序列迭代器返回代理引用时,您需要以非常量方式对该引用进行操作。例如考虑:

#include <vector>

int main()
{
std::vector<bool> v(10);
for (auto& e : v)
e = true;
}

这不会编译因为右值 vector<bool>::referenceiterator 返回不会绑定(bind)到非常量左值引用。但这会起作用:

#include <vector>

int main()
{
std::vector<bool> v(10);
for (auto&& e : v)
e = true;
}

综上所述,除非您知道您需要满足这样的用例,否则我不会以这种方式编写代码。 IE。我不会无缘无故地这样做,因为它确实会让人们想知道你在做什么。如果我真的这样做了,添加一个关于原因的评论也没什么坏处:

#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;
}

编辑

我的最后一个案例应该是一个有意义的模板。如果您知道循环始终处理代理引用,那么 autoauto&&一样有效.但是当循环有时处理非代理引用有时处理代理引用时,我认为 auto&&将成为首选的解决方案。

关于c++ - 在基于范围的 for 循环中使用转发引用有什么好处?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/16756811/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com