为什么Array*new Array; 在C++中失败了?

Meh*_*dad 9 c++ arrays pointers typedef new-operator

我一直认为T *p = new T;对所有人来说都是有效的C++ T......直到我尝试过

int main()
{
    typedef int Array[2];
    Array *p = new Array;
}
Run Code Online (Sandbox Code Playgroud)

得到这个可爱的错误,我无法解读:

error C2440: 'initializing' : cannot convert from 'int *' to 'Array (*)'
Run Code Online (Sandbox Code Playgroud)

有人可以解释为什么这是一个错误?

Jos*_*eld 12

如果动态分配数组类型,则会获得指向其第一个元素的指针.

§5.3.4[expr.new] new-expression创建的实体具有动态存储持续时间.如果实体是非数组对象,[...].如果它是一个数组,则new-expression返回一个指向数组初始元素的指针.

因此,既然您正在分配一个数组类型对象,那么您将获得int*它:

int *p = new Array;
Run Code Online (Sandbox Code Playgroud)

这与不使用typedef没什么不同:

int *p = new int[2];
Run Code Online (Sandbox Code Playgroud)

这也与您的T *p = new T;规则不符.也就是说,你绝对不能这样做:

int (*p)[2] = new int[2];
Run Code Online (Sandbox Code Playgroud)

我知道这种混乱可能已经造成的思想new ...[],以不同的特殊类型的表达式new ...,其中,new Array装配到后者的情况.我们经常建议可能会说" new[]应该总是匹配delete[]".那条规则有点误导.这里真正意味着new数组类型应始终匹配delete[].