列出数组未转换为指向单个元素的指针时的所有情况?

时间:2014-07-03 03:38:51

标签: c++ arrays pointers

到目前为止,我遇到过3个数组保持为数组的情况: (假设int arr[3][4];

  1. sizeof(arr):给出总大小(不是一个元素' s)
  2. & arr + 1:按地址大小推进地址
  3. 将对内部数组的引用绑定到以下范围:
  4. //

       for(const auto &row : arr)
           for(auto col : row)
               cout << col << endl;
    

    问题: 这是否会耗尽数组未转换为指向单个元素的指针的所有情况? 如果没有,是否有系统的方法来决定它?

1 个答案:

答案 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作为函数参数但不匹配原型参数
  • 模板类型扣除的一些案例
  • 推断出lambda的返回类型

值得注意的是,转换不是通过将arr绑定到引用来执行的(这是基于范围的for循环中发生的情况)。这由[dcl.init.ref]#5涵盖。在T &ref = arr;行中,=不是赋值运算符;它是声明语法的一部分。