5.3.4 New [expr.new]
....
new-type-id:
type-specifier-seq new-declaratoropt
new-declarator:
ptr-operator new-declaratoropt
noptr-new-declarator
noptr-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 ]