基于范围的循环中通用参考使用的利润是多少?

时间:2017-07-16 18:23:46

标签: c++ c++11 rvalue-reference

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

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

对于所有STL容器(vector<bool>除外)i具有左值引用类型。在这种情况下输入auto&&是否有任何实际意义?

1 个答案:

答案 0 :(得分:4)

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

另外,有时候我发生了一些没有从迭代器返回左值的范围。

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

对于教学,在你的for循环中告诉“使用auto&&也更容易。”因为它不会导致复制和工作无处不在。

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