我有以下代码:

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

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

但后来意识到我不知道它将如何工作。会在每次迭代中调用locations()方法,还是在本地“缓存”容器表达式求值的结果,从而只调用一次locations()?标准是否以一种或另一种方式定义了这种行为?

最佳答案

是的,它需要被“缓存”。

§[stmt.ranged] / 1说:


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

因此,这要求begin-exprend-expr各自仅被调用一次(当然,这受常规的“假设”规则的约束,因此,例如,如果它们没有可观察到的副作用,则可以更改)。

关于c++ - 基于范围的for循环会缓存容器表达式,还是在每次迭代时对其重新求值?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/34933294/

10-15 22:28