到目前为止,我遇到过3个数组保持为数组的情况:
(假设int arr[3][4];
)
//
for(const auto &row : arr)
for(auto col : row)
cout << col << endl;
问题: 这是否会耗尽数组未转换为指向单个元素的指针的所有情况? 如果没有,是否有系统的方法来决定它?
答案 0 :(得分:6)
发生此转换的大多数情况都包含在[expr]#8中:
每当glvalue表达式作为操作符的操作数出现时,该操作符需要该操作数的prvalue,lvalue-to-rvalue(4.1),array-to-pointer(4.2)或function-to-pointer(4.3)应用标准转换以将表达式转换为prvalue。
所有可以使用arr
的运算符都期望prvalue(或以其他方式明确请求此转换),但以下情况除外:
&
sizeof
++
--
alignof
typeid
(注意:此列表可能不详尽,如果有人指出其他案例,我会更新!)
现在,有各种可能的情况我们可以使用arr
并且它不是任何运算符的操作数。其中一些案例执行转换,一些案例不执行转换。执行转换的是:
arr
作为函数参数但不匹配原型参数值得注意的是,转换不是通过将arr
绑定到引用来执行的(这是基于范围的for循环中发生的情况)。这由[dcl.init.ref]#5涵盖。在T &ref = arr;
行中,=
不是赋值运算符;它是声明语法的一部分。