我对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 被重用了吗?我仍然很困惑,任何人都可以给我一些提示。谢谢!
答案 0 :(得分:4)
循环体内定义的变量是循环体的局部变量,因此每次循环迭代时都会被破坏和重新定义。所以int &i
在每次迭代中都是刚刚初始化的,没有问题。
如果我们将替换(通过一些简化)添加到您发布的示例中,可能会更清楚:
for (auto b = begin(vec), e = end(vec); b != e; ++b) {
int &i = *b;
//loop statement
}