Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/127.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
在基于范围的for循环中定义引用 我对C++是全新的,所以这个问题可能有点天真:D!最近,我被一个关于申报范围的问题弄糊涂了。我们可以写一些类似于: for(int &i : vec)_C++_C++11 - Fatal编程技术网

在基于范围的for循环中定义引用 我对C++是全新的,所以这个问题可能有点天真:D!最近,我被一个关于申报范围的问题弄糊涂了。我们可以写一些类似于: for(int &i : vec)

在基于范围的for循环中定义引用 我对C++是全新的,所以这个问题可能有点天真:D!最近,我被一个关于申报范围的问题弄糊涂了。我们可以写一些类似于: for(int &i : vec),c++,c++11,C++,C++11,然后发生了混乱。在我看来,变量i将被定义一次,并在每个循环中分配给不同的值。但在上面的例子中,i是一个引用,它只是一个别名,应该只绑定到一个对象。我认为解决这个问题的一个方法是每次都定义一个新的I。我搜索了进一步的解释,找到了一页:!: 语法属性(可选) 解释 上述语法生成的代码与以下代码类似(_范围、_开始和_结束仅用于说明): “范围_声明”在for循环中定义。但是在循环中定义的变量不是被重用了吗?这意味着我在第一个示例中定义的引用被重用了?我还是很困惑,谁能给我一些提示呢。谢谢 在循环

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


语法属性(可选)

解释

上述语法生成的代码与以下代码类似(_范围、_开始和_结束仅用于说明):



“范围_声明”在for循环中定义。但是在循环中定义的变量不是被重用了吗?这意味着我在第一个示例中定义的引用被重用了?我还是很困惑,谁能给我一些提示呢。谢谢

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

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

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

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

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

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

嗨,安杰,非常感谢你。我现在明白了。我认为我的误解在于不清楚循环中定义的变量。我认为变量只定义一次,以后会被重用。可以肯定的是,假设您上面编写的for循环有10次迭代。在第一轮中,定义了参考i,在满足右大括号后,i被销毁。现在在第二轮中,定义了一个新的引用i,一旦第二轮结束,它将被丢弃。这种模式一直延续到最后。我说得对吗?谢谢@dylanG35是的,你说得对。您可以自己创建一个类,在其构造函数和析构函数中执行可观察的操作(例如写入
std::cout
),并在循环中声明此类类型的局部变量,从而轻松验证这一点。您将看到在每次迭代中都会调用ctor和dtor。您好,Angew,非常感谢。我现在明白了。我认为我的误解在于不清楚循环中定义的变量。我认为变量只定义一次,以后会被重用。可以肯定的是,假设您上面编写的for循环有10次迭代。在第一轮中,定义了参考i,在满足右大括号后,i被销毁。现在在第二轮中,定义了一个新的引用i,一旦第二轮结束,它将被丢弃。这种模式一直延续到最后。我说得对吗?谢谢@dylanG35是的,你说得对。您可以自己创建一个类,在其构造函数和析构函数中执行可观察的操作(例如写入
std::cout
),并在循环中声明此类类型的局部变量,从而轻松验证这一点。您将看到在每次迭代中调用了ctor和dtor。
for (auto b = begin(vec), e = end(vec); b != e; ++b) {
  int &i = *b;
  //loop statement
}