在基于范围的循环中使用通用参考有什么好处?
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)
(我不记得是哪个了。如果你知道,请在评论中告诉我)
很多次我看到这样的代码:
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)
(我不记得是哪个了。如果你知道,请在评论中告诉我)