2016-02-26 500 views
-3

我在C++(仍然)有点生疏。每个循环都会调用右边的“getChildren()”函数吗?C++和for/in(?)循环

for (Node* node : this->m_stage->getChildren()) { 
} 

在附注上,这种循环的名称是什么?

+3

什么阻止你试用它? – user463035818

+3

我可以尝试一下,但是我可以认为它的行为与C++和编译器的每种风格都一样吗? – Jonny

+3

至少它会在你身边显示出一些努力 – user463035818

回答

3

这是从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 
    } 
} 
1

这是一个范围基于环路。不,右侧的表达式仅评估一次

更详细地,形式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 (由函数调用创建的临时值)。请注意,范围表达式也可能是一个数组或一个支撑列表。

0

这被称为基于范围的循环。你的循环大致相当于此:

{ 
    auto && __range = this->m_stage->GetChildren() ; 
    for (auto __begin = begin(__range), 
     __end = end(__range); 
     __begin != __end; ++__begin) { 
     Node* node = *__begin; 
    } 
} 

正如你所看到的,GetChildren只调用一次。