什么`auto && e`在基于范围的for循环中做什么?

tow*_*owi 28 c++ for-loop c++11 universal-reference forwarding-reference

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

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

我以我自己的经验和这个问题为例.

但是在读完关于循环的新简洁之后我想知道,我不应该用我&的规则替换我的规则&&吗?正如这里所写,这看起来像迈耶斯的通用参考.

所以,我问自己,如果我的新规则要么

使用for(auto const &&e :...)for(auto &&e:...)在可能的时候......

或者这不总是有效,因此应该是相当复杂的

检查for(auto const &&e :...)或者for(auto &&e:...)是可能的,再考虑for(auto const &e :...)或者for(auto &e:...),并且只在需要时不使用引用.

tow*_*owi 5

何时以及如果你应该使用auto&&in for循环已经很好地解释了Howard Hinnant在这里.

这留下什么的问题x

auto &&x = ...expr...
Run Code Online (Sandbox Code Playgroud)

实际上是.它被处理就好像有一个函数模板定义

template <class U> void f(const U& u);
Run Code Online (Sandbox Code Playgroud)

并且类型xu[§7.1.6.4.(7)] 推导出相同的图例.

这意味着它作为RValue参考处理,而是作为"通用/转发参考" - 适用" 参考折叠规则 ".

这也适用

const auto &&x = ...expr...
Run Code Online (Sandbox Code Playgroud)

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

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

没有,因为无论Ttemplate<class T> void f(const T&&)是的转发参考,也不const auto&&是.T&&参数声明中发生的事实并不意味着它是转发引用.只有纯粹T&&没有限定符const或者volatile是转发引用,这意味着它必须是template<class T> void f(T&&)或者auto&&,从不const T&&或者是constauto&&

  • 对于前向引用,它应该是 `template &lt;class U&gt; void f(U&amp;&amp; u);` 而不是 `template &lt;class U&gt; void f(const U&amp; u);` (2认同)