gpt4 book ai didi

c++ - 为什么 new int (*)[3] 是错误的?

转载 作者:可可西里 更新时间:2023-11-01 17:39:10 26 4
gpt4 key购买 nike

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

关于c++ - 为什么 new int (*)[3] 是错误的?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/26029277/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com