在多维数组中使用range-for循环时,类型推断为“自动”

时间:2018-11-28 02:48:32

标签: c++ c++11

<script language="JavaScript"> window.onload = function () { document.addEventListener("contextmenu", function (e) { e.preventDefault(); }, false); document.addEventListener("keydown", function (e) { //document.onkeydown = function(e) { // "I" key if (e.ctrlKey && e.shiftKey && e.keyCode == 73) { disabledEvent(e); } // "J" key if (e.ctrlKey && e.shiftKey && e.keyCode == 74) { disabledEvent(e); } // "S" key + macOS if (e.keyCode == 83 && (navigator.platform.match("Mac") ? e.metaKey : e.ctrlKey)) { disabledEvent(e); } // "U" key if (e.ctrlKey && e.keyCode == 85) { disabledEvent(e); } // "F12" key if (event.keyCode == 123) { disabledEvent(e); } }, false); function disabledEvent(e) { if (e.stopPropagation) { e.stopPropagation(); } else if (window.event) { window.event.cancelBubble = true; } e.preventDefault(); return false; } } //edit: removed ";" from last "}" because of javascript error </script> 之后,我运行:

int ia[3][4]{}

根据C ++入门第5篇:

  

因为当编译器时行不是引用
  初始化行,它将转换每个数组元素(像其他数组元素一样
  数组类型的对象)
  指向该数组第一个元素的指针

因此,如果row是指向for(auto row : ia) // row should be type int* for(int *j = std::begin(*row); j!= end(*row); ++j) // error!! std::cout << *j << std::endl; 的第一个元素的指针,那么为什么会发生错误?

非常感谢!

更新:

ia

1 个答案:

答案 0 :(得分:8)

推论row的类型为int*。这意味着,就像任何其他int*一样,编译器也不知道它指向的数组有多大,甚至根本不指向数组的第一个元素。当数组衰减为指向其第一个元素的指针时,所有这些信息都会丢失。

相反,如果您使用类似

for (auto& row : ia) // <-- NOTE: row is now a reference
    for (int* j = std::begin(row); j != std::end(row); ++j)
        std::cout << *j << '\n';

然后将row的类型推导为int (&)[4]:引用4个int的数组。保留长度信息,因此std::beginstd::end拥有所需的信息。


PS:请注意:range-for通过内部使用std::beginstd::end来工作,因此以上内容可以写得更简洁

for (auto& row : ia)
    for (auto j : row)
        std::cout << j << '\n';
相关问题