基于范围的for循环是否缓存容器表达式,或者每次迭代重新计算它?

时间:2016-01-21 20:05:33

标签: c++ c++11 foreach

我有以下代码:

for (auto it = _locations.locations().begin(); it != _locations.locations().end(); ++it)
   // Do something

我想用

替换它
for (const auto& location: _locations.locations())
   // Do something

然后意识到我不知道它是如何运作的。是否每次迭代都会调用locations()方法,或者容器表达式评估的结果是否会被缓存"在本地,只有一个locations()电话?标准是否以这种或那种方式定义了这种行为?

1 个答案:

答案 0 :(得分:7)

是的,需要“缓存”。

§[stmt.ranged] / 1说:

  

在每种情况下,基于范围的for语句等同于

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

因此,这要求begin-exprend-expr每次仅被调用一次(当然,这取决于正常的“as-if”规则,因此,如果,例如,它们没有可观察到的副作用)。