Why is new int (*)[3] an error?

前端 未结 1 986
醉酒成梦
醉酒成梦 2020-12-19 04:23
typedef int (*A)[3];

int (**p)[3] = new A;              // OK
int (**q)[3] = new (int(*)[3]);    // OK
int (**r)[3] = new int (*)[3];     // error

相关标签:
1条回答
  • 2020-12-19 05:07

    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-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 ]

    0 讨论(0)
提交回复
热议问题