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:...),并且只在需要时不使用引用.
何时以及如果你应该使用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)
并且类型x由u[§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无效:
没有,因为无论
T在template<class T> void f(const T&&)是的转发参考,也不const auto&&是.T&&参数声明中发生的事实并不意味着它是转发引用.只有纯粹T&&没有限定符const或者volatile是转发引用,这意味着它必须是template<class T> void f(T&&)或者auto&&,从不const T&&或者是constauto&&