C++ and for/in (?) loops

C++ and for/in (?) loops

本文关键字:loops in and for C++      更新时间:2023-10-16

我对C++有点生疏(仍然)。右边的"getChildren()"函数会在每个循环中调用吗?

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

附带说明一下,这种循环的名称是什么?

它是从 c++11 引入的基于范围的 for 循环。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 的循环大致等同于以下循环标准:

{
    auto && c : expr;
    for (auto it = begin(c), e = end(c); it != e; ++it)
    {
        T x = *it;
        body
    }
}

特别是,这意味着范围表达式(在我的示例中expr)可以是右值(由函数调用创建的临时值)。请注意,范围表达式也可以是数组或大括号列表。

称为基于范围的 for 循环。您的循环大致等效于以下内容:

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

如您所见,GetChildren只调用一次。