我有以下代码:
for (auto it = _locations.locations().begin(); it != _locations.locations().end(); ++it)
// Do something
我想用
替换它for (const auto& location: _locations.locations())
// Do something
然后意识到我不知道它是如何运作的。是否每次迭代都会调用locations()
方法,或者容器表达式评估的结果是否会被缓存"在本地,只有一个locations()
电话?标准是否以这种或那种方式定义了这种行为?
答案 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-expr
和end-expr
每次仅被调用一次(当然,这取决于正常的“as-if”规则,因此,如果,例如,它们没有可观察到的副作用)。