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

What profit of universal reference usage in range based loop?

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

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& 将无法编译,因为从迭代器返回纯右值。

此外,我有时会遇到不从其迭代器返回左值的范围。

此外,使用 auto&& 的好处是它在任何情况下都不起作用。即使你有一个奇怪的情况,你的迭代器产生一个 const 右值引用,auto&& 将绑定到它。

为了教学,讲出来也比较容易"use auto&& in your for loops.",因为不会造成到处抄袭和工作

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