我可以为一维数组编写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++类型系统。