当我这样做时:
for (auto p : foo()) {
// ...
}
是在循环的每次迭代中评估foo()
吗?
答案 0 :(得分:4)
不,只有一次。
的基于范围的
[C++11: 6.5.4]:
对于表单for
语句for ( for-range-declaration : expression ) statement
让 range-init 等同于括号
所包围的表达式( expression )
[..] 基于范围的for语句等同于
{ auto && __range = range-init; for ( auto __begin = begin-expr, __end = end-expr; __begin != __end; ++__begin ) { for-range-declaration = *__begin; statement } }
[..]
有趣的是,这个相对较新的段落是使用预先存在的语言特征在代码方面定义语义的标准的罕见示例。我猜他们厌倦了写简洁的技术语言。
这意味着我们必须从代码中推断上述事实;在这种情况下,幸运的是,它很容易: range-init 被评估一次并绑定到通用引用__range
。