2012-11-05 66 views
14

范围基于for语句在§6.5.4定义为等同于:为什么基于范围的语句采用auto &&的范围?

{ 
    auto && __range = range-init; 
    for (auto __begin = begin-expr, 
      __end = end-expr; 
     __begin != __end; 
     ++__begin) { 
    for-range-declaration = *__begin; 
    statement 
    } 
} 

其中range-init被用于这两种形式的范围所定义的基于for为:

for (for-range-declaration : expression)   => (expression) 
for (for-range-declaration : braced-init-list) => braced-init-list 

(该条款进一步规定了其他子表达式的含义)

为什么__range给出e推导类型auto&&?我对auto&&的理解是,它通过传递std::forward来保存表达式的原始值(左值/右值)是有用的。但是,__range未通过std::forward传递到任何地方。它仅在获取范围迭代器时使用,如__range,__range.begin()begin(__range)之一。

使用“通用参考”auto&&有什么好处? auto&会不会足够?

注意:据我所知,the proposal没有说任何关于auto&&的选择。

+1

这样你可以使用范围内的r值。 –

+0

“*据我所知,该提案没有提及auto &&的选择。*”该提议还使用了C++ 11中不存在的范围库。 –

+2

为了将来的参考,例如由例如描述的表达的性质。 “左值”或“右值”是它的值类别。 –

回答

16

会不会自动&够了?

不,它不会。它不允许使用计算范围的r值表达式。使用auto&&是因为它可以绑定到l值表达式 r值表达式。所以你不需要将范围粘贴到变量中以使其工作。

或者,换一种方式,这将是不可能的:

for(const auto &v : std::vector<int>{1, 43, 5, 2, 4}) 
{ 
} 

岂不const auto&就够了?

不,它不会。一个const std::vector将永远只会返回const_iterator s的内容。如果您想对内容执行非const遍历,那将无济于事。

+0

糟糕,我其实是想问一下'const auto&'是否够用。这不会绑定到任何东西吗? –

+0

@sftrabbit:它不会绑定到*非const * l值。 'const std :: vector'将只返回'const'迭代器。 –

+0

谢谢。这意味着'auto &&'在绑定到任何东西时也是有用的,除了转发之外,它不会使其成为'const'。 –