typedef int (*A)[3];
int (**p)[3] = new A; // OK
int (**q)[3] = new (int(*)[3]); // OK
int (**r)[3] = new int (*)[3]; // error
来自GCC的错误是error: expected primary-expression before ')' token
。为什么在此表达式中需要多余的括号?
该标准将new-type-id定义为new-declarator的最长序列。还有一条注释,说明了类似的情况(尽管它为函数分配了指针):
5.3.4新[expr.new]
....
new-type-id:
类型说明符序列 新声明符opt新声明
符:ptr-operator新声明符opt
noptr-new-declaratornoptr-new-declarator:
[ 表达式 ] 属性说明符序列选择
noptr-new-declarator [ 常量表达式 ] 属性-说明符 序列选择....
该新型-ID在一个新的表达是可能的最长序列的新声明符。[注:在说明符运营商之间这防止模糊度
&
,&&
,*
,和[]
和它们的表达对应。— 尾注] [示例:new int * i; // syntax error: parsed as (new int*) i, not as (new int)*i
该
*
是指针说明符,而不是乘法运算。— 结束示例][注意:new表达式的new- id中的括号可能会产生令人惊讶的效果。[示例:
new int(*[10])(); // error
格式不正确,因为绑定是
(new int) (*[10])(); // error
取而代之的是,
new
可以使用带括号的运算符版本来创建复合类型(3.9.2)的对象:new (int (*[10])());
分配的10个函数指针(取任何参数和返回一个数组
int
- 端示例] - 注完]
本文收集自互联网,转载请注明来源。
如有侵权,请联系 [email protected] 删除。
我来说两句