我可以为一维数组编写new运算符,如下所示:

int n{3};
new int[n];

它至少分配sizeof(int) * n字节。但是,当我想创建二维和二维数组时,只有第一维可能是非恒定的:
int n{3};
new int[n][3]; //ok
new int[n][n]; //error;

为什么会有这样的限制?确定要分配至少sizeof(int) * n * n个字节有什么困难吗?

最佳答案

C++类型系统不包括受运行时限制的数组。考虑到这将对模板和重载解析产生影响,因此这是一件非常复杂的事情。已经提出了一些建议,但都没有进展为接受标准化。

因此T[n]不是有效的类型。但是,由于有特殊情况,因此可以在new -expression中使用。 new -expression可以是:

  • new X,其中X
  • 类型
  • new T[n],其中T是类型,而n不是常数表达式。

  • 请注意,这两种情况都是必需的,因为T[n]不是类型,但我们希望在new -expression中允许这种情况。

    第二点需要更多解释。实际上,它使用C++前缀表示法,因此,如果T是数组或函数类型,则[n]将位于不同的位置。例如new int[n][3]是OK,这与typedef int T[3]; new T[n]相同。但是new int[3][n]不是。

    如果我们确实允许new int[3][n],那么返回类型是什么?如前所述,int (*)[n]不属于C++类型系统。

    10-05 21:10
    查看更多