假设我使用基于范围的循环编程时的当前规则
尽可能
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:...)
,并且仅在需要时不使用引用。
答案 0 :(得分:6)
Howard Hinnant在Reference 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
才能转发引用,这意味着它必须是volatile
或template<class T> void f(T&&)
,而不是auto&&
或constconst T&&