为什么必须在基于范围的for循环中使用引用

Des1gnWizard

我被困在C ++ Primer中的一段代码中,并且考虑了超过1个小时。该代码是

for (auto row : ia)//should use &row here
   for (auto col : row)

对此的解释是

我们这样做是为了避免普通数组到指针的转换。因为row不是引用,所以当编译器初始化row时,它将把每个数组元素(像其他任何数组类型的对象一样)转换为指向该数组第一个元素的指针。结果,在此循环中,行的类型为int *。内部for循环是非法的。尽管有我们的意图,但是该循环尝试对int *进行迭代。

我知道每次都与迭代有关for(auto col:row)我不明白的

我们这样做是为了避免将普通数组转换为指针”

我们为外循环传递的“ ia”是什么形式?它应该是指向其第一个元素的地址的指针,而不是指向“具体”数组的指针吗?那么内循环怎么了?我认为应该与外部循环使用相同的机制。.我不明白问答环节。请有人启发我...我的理解有什么问题...也欢迎一个良好的链接!提前谢谢了!

ia的声明是

constexpr size_t rowCnt = 3, colCnt = 4;
int ia[rowCnt][colCnt]; // 12 uninitialized elements
// for each row
  for (size_t i = 0; i != rowCnt; ++i) {
// for each column within the row
    for (size_t j = 0; j != colCnt; ++j) {
// assign the element's positional index as its value
        ia[i][j] = i * colCnt + j;
    }
}
萨钦·戈亚尔

通常,基于范围的for循环声明为:

 for ( decl : coll ) {
 statement } 

如果coll提供begin()和end()成员,则等效于以下内容:

    for (auto _pos=coll.begin(), _end=coll.end(); _pos!=_end; ++_pos ) 
   {  
      decl = *_pos; 
       statement 
    } 

或者,如果不匹配,则使用以coll作为参数的全局begin()和end()进行以下操作:

for (auto _pos=begin(coll), _end=end(coll); _pos!=_end; ++_pos )
 { 
    decl = *_pos; 
    statement 
 } 

现在看一行decl = *_pos;,在这里每次编译器将初始化dec时,它将把每个数组元素(像数组类型的任何其他对象一样)转换为指向该数组第一个元素的指针。

在您的情况下,raw的类型将显示为int *,在该类型上next for循环无法工作,因此它变为非法。

本文收集自互联网,转载请注明来源。

如有侵权,请联系[email protected] 删除。

编辑于
0

我来说两句

0条评论
登录后参与评论

相关文章

来自分类Dev

为什么在此处的for循环中必须使用可变引用?

来自分类Dev

为什么我必须在mongoDB查询中使用+

来自分类Dev

在基于范围的for循环中使用的方法返回容器

来自分类Dev

在Swift函数中,当函数在循环中包含带if语句的for循环时,为什么“ return”必须在for循环之外?

来自分类Dev

在for循环中使用负范围时,为什么Python不抛出ValueError?

来自分类Dev

为什么我必须在gulp中使用乙烯基源流?

来自分类Dev

为什么我必须在学说关系中使用对象?

来自分类Dev

当通过diff定义函数时,为什么必须在maple中使用unapply运算符?

来自分类Dev

为什么我必须在ggplot中使用aes_string()闪亮?

来自分类Dev

为什么我必须在docker-compose中使用volume指令

来自分类Dev

为什么在Flask应用程序开发中必须在PostgreSQL中使用SQLAlchemy?

来自分类Dev

为什么我必须在 ES6 的地图闭包中使用 return ?

来自分类Dev

为什么我必须在这个回文检查中使用 return ?

来自分类Dev

为什么Coffeescript在循环中使用其他变量?

来自分类Dev

为什么在for循环中使用分号而不是昏迷?

来自分类Dev

为什么Coffeescript在循环中使用其他变量?

来自分类Dev

基于范围的循环中的常量引用不起作用

来自分类Dev

在基于范围的循环中使用lambda的初始化列表

来自分类Dev

可以在基于范围的for循环中使用模板化的begin / end方法

来自分类Dev

什么时候必须在测试中使用TestEntityManager?

来自分类Dev

我必须在ORACLE中使用什么Join?

来自分类Dev

什么时候必须在测试中使用TestEntityManager?

来自分类Dev

我必须在virtocommerce中使用的基本URL是什么?

来自分类Dev

为什么我必须在jQuery查询后使用[0]

来自分类Dev

基于范围的for循环中的&和&&有什么区别?

来自分类Dev

为什么必须在Angular 2应用程序中使用所有带有Component选择器的组件?

来自分类Dev

为什么我必须在正则表达式的正则表达式中使用replace?

来自分类Dev

我遇到了一些 C++ 代码。为什么我们必须在块中使用 *this 而不是 this?

来自分类Dev

为什么在std :: map上基于范围的for循环中的const std :: pair <K,V>&不起作用?

Related 相关文章

  1. 1

    为什么在此处的for循环中必须使用可变引用?

  2. 2

    为什么我必须在mongoDB查询中使用+

  3. 3

    在基于范围的for循环中使用的方法返回容器

  4. 4

    在Swift函数中,当函数在循环中包含带if语句的for循环时,为什么“ return”必须在for循环之外?

  5. 5

    在for循环中使用负范围时,为什么Python不抛出ValueError?

  6. 6

    为什么我必须在gulp中使用乙烯基源流?

  7. 7

    为什么我必须在学说关系中使用对象?

  8. 8

    当通过diff定义函数时,为什么必须在maple中使用unapply运算符?

  9. 9

    为什么我必须在ggplot中使用aes_string()闪亮?

  10. 10

    为什么我必须在docker-compose中使用volume指令

  11. 11

    为什么在Flask应用程序开发中必须在PostgreSQL中使用SQLAlchemy?

  12. 12

    为什么我必须在 ES6 的地图闭包中使用 return ?

  13. 13

    为什么我必须在这个回文检查中使用 return ?

  14. 14

    为什么Coffeescript在循环中使用其他变量?

  15. 15

    为什么在for循环中使用分号而不是昏迷?

  16. 16

    为什么Coffeescript在循环中使用其他变量?

  17. 17

    基于范围的循环中的常量引用不起作用

  18. 18

    在基于范围的循环中使用lambda的初始化列表

  19. 19

    可以在基于范围的for循环中使用模板化的begin / end方法

  20. 20

    什么时候必须在测试中使用TestEntityManager?

  21. 21

    我必须在ORACLE中使用什么Join?

  22. 22

    什么时候必须在测试中使用TestEntityManager?

  23. 23

    我必须在virtocommerce中使用的基本URL是什么?

  24. 24

    为什么我必须在jQuery查询后使用[0]

  25. 25

    基于范围的for循环中的&和&&有什么区别?

  26. 26

    为什么必须在Angular 2应用程序中使用所有带有Component选择器的组件?

  27. 27

    为什么我必须在正则表达式的正则表达式中使用replace?

  28. 28

    我遇到了一些 C++ 代码。为什么我们必须在块中使用 *this 而不是 this?

  29. 29

    为什么在std :: map上基于范围的for循环中的const std :: pair <K,V>&不起作用?

热门标签

归档