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-declarators 序列。还有一个注释,它说明了类似的情况(尽管它分配了指向函数的指针):
5.3.4 New [expr.new]
....
new-type-id:
type-specifier-seq new-declaratoroptnew-declarator:
ptr-operator new-declaratoropt
noptr-new-declaratornoptr-new-declarator:
[ expression ] attribute-specifier-seqopt
noptr-new-declarator [ constant-expression ] attribute-specifier-seq opt....
The new-type-id in a new-expression is the longest possible sequence of new-declarators. [ Note: this prevents ambiguities between the declarator operators
&
,&&
,*
, and[]
and their expression counterparts. — end note ] [ Example:new int * i; // syntax error: parsed as (new int*) i, not as (new int)*i
The
*
is the pointer declarator and not the multiplication operator. — end example ][ Note: parentheses in a new-type-id of a new-expression can have surprising effects. [ Example:
new int(*[10])(); // error
is ill-formed because the binding is
(new int) (*[10])(); // error
Instead, the explicitly parenthesized version of the
new
operator can be used to create objects of compound types (3.9.2):new (int (*[10])());
allocates an array of 10 pointers to functions (taking no argument and returning
int
. — end example ] — end note ]
关于c++ - 为什么 new int (*)[3] 是错误的?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/26029277/