在 <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
答案 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::begin
和std::end
拥有所需的信息。
PS:请注意:range-for通过内部使用std::begin
和std::end
来工作,因此以上内容可以写得更简洁
for (auto& row : ia)
for (auto j : row)
std::cout << j << '\n';