typedef int (*A)[3];
int (**p)[3] = new A; // OK
int (**q)[3] = new (int(*)[3]); // OK
int (**r)[3] = new int (*)[3]; // error
The error from GCC is error: expected primary-expression before ')' token
. Why are the extra parentheses required in this expression?
The standard defines new-type-id as the longest sequence of new-declarators. There is also a note, which illustrates a similar situation (although it allocates pointers to functions):
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 ]
If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!
Donate Us With