基于范围的for循环,带有&

时间:2019-02-27 01:48:12

标签: c++ c++11

我还没有找到能回答我困惑的部分的问题,如果有人回答了我,我深表歉意。

我对这个for循环中发生的事情感到困惑,它如何遍历地址?

int arr[] = {1,2,3,4,5};
for(const int &arrEntry : arr){
     cout << arrEntry << " ";
}

3 个答案:

答案 0 :(得分:5)

也许std::vector<int>的位置引起混乱。请记住,C ++不在乎您在何处放置空格。由于以下内容:&是新变量for (const int &arrEntry : arr)声明,可在循环内使用,因此在其名称的左侧使用arrEntry表示我们定义的对象具有 reference 类型,特别是&是对arrEntry引用。这意味着在循环中,const int不是您要循环访问的数据的副本,而是对其的引用。 arrEntry表示您无法更改其值。

如果这不是声明,并且先前定义了const,则表达式arrEntry的确将采用&arrEntry的地址。在循环体内,已经定义了arrEntry,因此您可以使用arrEntry

获取其地址。
&arrEntry

答案 1 :(得分:3)

C ++中基于范围的for循环实际上只是语法糖,它等效于以下内容(由cppreference提供:

for (range_declaration : range_expression) loop_statement;

// is equivalent to:

{
    auto && __range = range_expression ;
    for (auto __begin = begin_expr, __end = end_expr; __begin != __end; ++__begin) {

        range_declaration = *__begin;
        loop_statement

    }
}

在上面的代码块中,begin_exprend_expr分别等效于std::begin(__range)std::end(__range)

因此,在使用const int &arrEntry的情况下,arrEntry实际上是在“真实”(常规)for循环内声明的,因此在每次迭代中它都引用范围内的另一个对象,就像直接使用原始迭代器。

请注意,如果在普通的for循环之外声明arrEntry,则不可能实现此操作,因为无法将引用重新指向引用不同的对象。

要考虑的另一个重要的(侧面)事实是range_expression在循环的整个过程中都保持活动状态,这意味着您可以在其中使用prvalue(例如,调用返回{按值{1}}。

答案 2 :(得分:2)

在您的代码中,&arrEntry是对arr的引用。这在基于范围的前循环中是隐含的。

for(const int &arrEntry : arr){
     cout << arrEntry << " ";
}

您可以在没有参考的情况下进行操作,结果是相同的。 但是请注意,arr的值已复制到arrEntry。

for(const int arrEntry : arr){
     cout << arrEntry << " ";
}