很多次我看到这样的代码:
template<typename Collection>
void Foo(Collection&& c)
{
for (auto&& i : std::forward<Collection>(c))
// do something with i
}
对于所有STL容器(vector<bool>
除外)i
具有左值引用类型。在这种情况下输入auto&&
是否有任何实际意义?
答案 0 :(得分:4)
正如你所说,你没有左值的完美例子是std::vector<bool>
。使用auto&
将无法编译,因为从迭代器返回了prvalue。
另外,有时候我发生了一些没有从迭代器返回左值的范围。
此外,使用auto&&
的好处是没有任何情况下它不起作用。即使你有一个奇怪的情况,你的迭代器产生一个const右值引用,auto&&
将绑定它。
对于教学,在你的for循环中告诉“使用auto&&
也更容易。”因为它不会导致复制和工作无处不在。
还有一个提议允许隐式auto&&
并启用语法for (x : range)
(我不记得是哪一个。如果您知道,请在评论中告诉我)