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[].