为什么'new int (*)[10]'错误?

Heb*_* FF 12 c++ new-operator multidimensional-array

我尝试了这段代码:

auto p = new int (*)[10];
Run Code Online (Sandbox Code Playgroud)

但我收到错误消息:

test.cc:8:21: error: expected expression
        auto p = new int (*)[10];
                           ^
1 error generated.
Run Code Online (Sandbox Code Playgroud)

我改变了我的代码:

typedef int array[10];
auto p = new array *;
Run Code Online (Sandbox Code Playgroud)

然后一切都很顺利。为什么是这样?

for*_*818 15

有关详细信息,请参阅https://en.cppreference.com/w/cpp/language/new

没有初始化程序的语法new

new (type)
Run Code Online (Sandbox Code Playgroud)

或者

new type
Run Code Online (Sandbox Code Playgroud)

在第二种情况下type可能不包含括号。上面的链接页面也演示了这一点:

new int(*[10])();    // error: parsed as (new int) (*[10]) ()
new (int (*[10])()); // okay: allocates an array of 10 pointers to functions
Run Code Online (Sandbox Code Playgroud)

对于您的情况,这意味着:

auto p = new int (*)[10];     // error: parsed as (new int) ((*)[10])
auto p = new ( int (*)[10] ); // ok
Run Code Online (Sandbox Code Playgroud)

当你使用别名时,你可以写

auto p = new array *;
Run Code Online (Sandbox Code Playgroud)

因为这里type不包含括号。