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[]
.
归档时间: |
|
查看次数: |
342 次 |
最近记录: |