当前位置:  开发笔记 > 编程语言 > 正文

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

如何解决《为什么必须在基于范围的for循环中使用引用》经验,为你挑选了1个好方法。

我被困在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"的形式?它应该是指向其第一个元素的地址而不是"具体"数组的指针吗?那么内循环有什么不对?我认为它应该是与外循环相同的机制..我无法理解Q&A上的帖子.请有人赐教......我的理解有什么不对......也欢迎一个好的链接!提前谢谢了!

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;
    }
}

SACHIN GOYAL.. 5

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

 for ( decl : coll ) {
 statement } 

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

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

或者,如果不匹配,则使用全局begin()和end()将coll作为参数:

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

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

在你的情况下,raw的类型将出现在int*上,下一个for循环无法工作,因此它变得非法.



1> SACHIN GOYAL..:

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

 for ( decl : coll ) {
 statement } 

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

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

或者,如果不匹配,则使用全局begin()和end()将coll作为参数:

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

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

在你的情况下,raw的类型将出现在int*上,下一个for循环无法工作,因此它变得非法.

推荐阅读
手机用户2402852387
这个屌丝很懒,什么也没留下!
DevBox开发工具箱 | 专业的在线开发工具网站    京公网安备 11010802040832号  |  京ICP备19059560号-6
Copyright © 1998 - 2020 DevBox.CN. All Rights Reserved devBox.cn 开发工具箱 版权所有