【发布时间】:2014-01-15 13:52:36
【问题描述】:
当我这样做时:
for (auto p : foo()) {
// ...
}
是否在循环的每次迭代中评估 foo()?
【问题讨论】:
-
哦,哎呀......stackoverflow.com/questions/16259574/… :( 在撰写本文时,它根本没有出现在“相关帖子”列表中。Grr
当我这样做时:
for (auto p : foo()) {
// ...
}
是否在循环的每次迭代中评估 foo()?
【问题讨论】:
不,只有一次。
[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。
【讨论】:
auto && 在该语言中之前不存在. +1,不过。
for,虽然;)