【问题标题】:What does `auto && e` do in range-based for-loops?`auto && e` 在基于范围的 for 循环中有什么作用?
【发布时间】:2015-01-15 11:15:12
【问题描述】:

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

尽可能使用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:...),仅在需要时不要使用引用。

【问题讨论】:

  • auto && 始终有效。这就是为什么它是“通用的”。如有必要,推导的类型将被限定。
  • const auto&& 不是转发引用,它是 const 右值引用
  • @Bulletmagnet 在CppCon'14期间是STL
  • @PiotrS。坎宁安定律指出“在互联网上获得正确答案的最佳方式不是提出问题,而是发布错误的答案。”

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


【解决方案1】:

Howard Hinnant here 很好地解释了何时以及是否应该在 for 循环中使用 auto&&

这就留下了x在里面的问题

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

其实是。并且好像有函数模板定义一样处理

template <class U> void f(const U& u);

x 的类型由与u [§7.1.6.4.(7)] 相同的规则推导出来。

这意味着它作为 RValue 引用处理,而是作为“通用/转发引用”——“Reference Collapsing Rules”适用。

这也适用于

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

作为 §7.1.6.4.(7) 中的示例,至少对于 const auto &amp;x

但是,正如 PiotrS 在问题 cmets 中所说,任何限定符都会使 URef 无效:

不,因为template&lt;class T&gt; void f(const T&amp;&amp;) 中的T 不是转发引用,const auto&amp;&amp; 也不是。 T&amp;&amp; 出现在参数声明中的事实并不意味着它是转发引用。只有没有 constvolatile 等限定符的纯 T&amp;&amp; 是转发引用,这意味着它必须是 template&lt;class T&gt; void f(T&amp;&amp;)auto&amp;&amp;,而不是 const T&amp;&amp;const auto&amp;&amp;

【讨论】:

  • For Forward reference,应该是template &lt;class U&gt; void f(U&amp;&amp; u); 而不是template &lt;class U&gt; void f(const U&amp; u);
  • “使 URef 无效”具有高度误导性...... const T&amp;&amp; 的引用折叠发生在 T&amp;&amp; 上。它不再是“通用的”,因为无法匹配 Universe 中的一半类型(不符合 const 限定的类型),但它的行为大致相同。
  • @BenVoigt 这不仅仅是资格。 const auto&amp;&amp; 声明符或 template&lt;class U&gt; void f(const U&amp;&amp; u); 中的 u 永远不能从任何左值自动推断类型。使其对真正的转发引用有效的特殊规则(间接地对确切类型auto&amp;&amp;)不再适用。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2013-06-06
  • 2016-10-31
  • 1970-01-01
  • 2013-01-04
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多