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

时间:2013-12-04 15:00:12

标签: c++ c++11

我对C ++完全不熟悉,所以问题可能有点天真:D!最近我对基于范围的声明中的一个问题感到困惑。我们被允许写一些类似的东西:

for(int &i : vec)

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


语法attr(可选)

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 被重用了吗?我仍然很困惑,任何人都可以给我一些提示。谢谢!

1 个答案:

答案 0 :(得分:4)

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

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

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