在基于范围的for循环中定义引用

Define a reference in a range-based for loop

本文关键字:循环 for 定义 引用 于范围 范围      更新时间:2023-10-16

我对C++完全陌生,所以这个问题可能有点天真:D!最近,我被一个与基于的申报范围有关的问题弄糊涂了。我们可以写这样的东西:

for(int &i : vec)

然后发生了一场混乱。在我看来,变量i将被定义一次,并在每个循环中分配给不同的值。但在上面的情况下,i是一个引用,它只是一个别名,应该只绑定到一个对象。我认为解决这一问题的一种方法是认为每次都会定义一个新的I。我搜索了关于这一点的进一步解释,发现了一个页面:range for!:


语法属性(可选)

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
}

"range_declaration"是在for循环中定义的。但是,循环中定义的变量是否被重用,这意味着第一个例子中定义的引用i被重用?尽管如此,我还是很困惑,谁能给我一些提示吗。谢谢

在循环体内部定义的变量是循环体的局部变量,因此在每次循环迭代时都会被销毁并重新定义。所以int &i在每次迭代中都是新初始化的,没有问题。

如果我们从替换(经过一些简化)到您发布的示例中,可能会更清楚:

for (auto b = begin(vec), e = end(vec); b != e; ++b) {
  int &i = *b;
  //loop statement
}