【问题标题】:What profit of universal reference usage in range based loop?在基于范围的循环中使用通用参考有什么好处?
【发布时间】:2017-07-18 21:27:59
【问题描述】:
我多次看到这样的代码:
template<typename Collection>
void Foo(Collection&& c)
{
for (auto&& i : std::forward<Collection>(c))
// do something with i
}
对于所有 STL 容器(vector<bool> 除外)i 具有左值引用类型。在这种情况下输入auto&& 有什么实际意义吗?
【问题讨论】:
标签:
c++
c++11
rvalue-reference
【解决方案1】:
正如您所说,没有左值的完美示例是std::vector<bool>。使用auto& 将无法编译,因为从迭代器返回纯右值。
另外,有时我也遇到过创建没有从其迭代器返回左值的范围。
此外,使用auto&& 的好处是没有任何情况下它不起作用。即使你有一个奇怪的情况,你的迭代器产生一个 const rvalue 引用,auto&& 也会绑定到它。
对于教学,也更容易说“在你的 for 循环中使用 auto&&”。因为它不会导致到处复制和工作。
那里还有一个建议允许隐式auto&&并启用语法for (x : range)(我不记得是哪个。如果你知道,请在cmets中告诉我)