我在C++(仍然)有点生疏。每个循环都会调用右边的“getChildren()”函数吗?C++和for/in(?)循环
for (Node* node : this->m_stage->getChildren()) {
}
在附注上,这种循环的名称是什么?
我在C++(仍然)有点生疏。每个循环都会调用右边的“getChildren()”函数吗?C++和for/in(?)循环
for (Node* node : this->m_stage->getChildren()) {
}
在附注上,这种循环的名称是什么?
这是从C++ 11引入的Range-based for loop。而this->m_stage->getChildren()
将只评估一次。
语法
attr(optional) for (range_declaration : range_expression) loop_statement
上述语法产生码等效于以下(__range, __begin和__end是为了说明仅):
{ auto && __range = range_expression ; for (auto __begin = begin_expr, __end = end_expr; __begin != __end; ++__begin) { range_declaration = *__begin; loop_statement } }
这是一个范围基于环路。不,右侧的表达式仅评估一次。
更详细地,形式for (T x : expr) body
的环是大致相当于以下标准for循环:
{
auto && c : expr;
for (auto it = begin(c), e = end(c); it != e; ++it)
{
T x = *it;
body
}
}
特别地,这意味着该范围表达式(expr
在我的例子)可以是一个rvalue (由函数调用创建的临时值)。请注意,范围表达式也可能是一个数组或一个支撑列表。
这被称为基于范围的循环。你的循环大致相当于此:
{
auto && __range = this->m_stage->GetChildren() ;
for (auto __begin = begin(__range),
__end = end(__range);
__begin != __end; ++__begin) {
Node* node = *__begin;
}
}
正如你所看到的,GetChildren
只调用一次。
什么阻止你试用它? – user463035818
我可以尝试一下,但是我可以认为它的行为与C++和编译器的每种风格都一样吗? – Jonny
至少它会在你身边显示出一些努力 – user463035818