什么是'auto&& amp; e`做基于范围的for循环?

时间:2014-11-18 09:59:18

标签: c++ c++11 for-loop universal-reference forwarding-reference

假设我使用基于范围的循环编程时的当前规则

  

尽可能for(auto const &e :...)for(auto &e:...)使用for(auto a: ...)

我的观点基于我自己的经验,例如this question

但在阅读了我想知道的新terse for loops后,我是否应该用&替换我的规则中的&&?如here所示,这看起来像Meyers' Universal References

所以,我问自己,我的新规则应该是

  

尽可能使用for(auto const &&e :...)for(auto &&e:...)

或者这并不总是有效,因此应该是非常复杂的

  

检查是否可以for(auto const &&e :...)for(auto &&e:...),然后考虑for(auto const &e :...)for(auto &e:...),并且仅在需要时不使用引用。

1 个答案:

答案 0 :(得分:6)

Howard HinnantReference Collapsing Rules处非常好地解释了何时以及如何在for循环中使用auto&&

这就留下了{/ 1}}

中的问题
x
实际上是。它被处理就好像有一个函数模板定义

auto &&x = ...expr...

template <class U> void f(const U& u); 的类型由与x [§7.1.6.4。(7)]相同的tules推导出来。

这意味着作为RValue参考处理,但作为“通用/转发参考” - “{{3}}”适用。

这也适用于

u

作为§7.1.6.4。(7)中的例子说明,至少对于const auto &&x = ...expr...

但是,正如PiotrS在问题评论中所说,任何限定词都会使URef-ness无效:

  

不,因为const auto &x中的T都不是转发引用,template<class T> void f(const T&&)也不是。{1}}。参数声明中出现const auto&&这一事实并不意味着它是转发引用。只有没有T&&T&&等限定符的纯const才能转发引用,这意味着它必须是volatiletemplate<class T> void f(T&&),而不是auto&&或const const T&&