在基于范围的循环中使用通用参考有什么好处?

What profit of universal reference usage in range based loop?

本文关键字:参考 什么 于范围 范围 循环      更新时间:2023-10-16

很多次我看到这样的代码:

template<typename Collection>
void Foo(Collection&& c)
{
for (auto&& i : std::forward<Collection>(c))
// do something with i
}

对于所有 STL 容器(vector<bool>除外(,i具有左值引用的类型。在这种情况下输入auto&&有什么实际意义吗?

正如你所说,你没有左值的完美例子是std::vector<bool>.使用auto&将无法编译,因为 prvalue 是从迭代器返回的。

此外,有时我碰巧要制作没有从其迭代器返回左值的范围。

此外,使用auto&&的好处是没有它不起作用的情况。即使你有一个奇怪的情况,你的迭代器产生一个常量右值引用,auto&&会绑定到它。

对于教学,也更容易分辨"在你的 for 循环中使用auto&&",因为它不会导致复制和到处工作。

那里还有一个建议允许隐式auto&&并启用语法for (x : range)(我不记得是哪一个。如果你知道,请在评论中告诉我(