我有以下代码:
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-expr
和end-expr
各自仅被调用一次(当然,这受常规的“假设”规则的约束,因此,例如,如果它们没有可观察到的副作用,则可以更改)。关于c++ - 基于范围的for循环会缓存容器表达式,还是在每次迭代时对其重新求值?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/34933294/