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

12

我尝试了这段代码:

auto p = new int (*)[10];

但我收到了错误信息:

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

我修改了我的代码:

typedef int array[10];
auto p = new array *;

然后一切顺利。这是为什么呢?


3
也许你尝试过 auto p = new (int (*)[10]); - WhozCraig
3
请参见 https://zh.cppreference.com/w/cpp/language/new - HolyBlackCat
如果这真的是你得到的唯一错误消息,那就有点糟糕了,因为它对于你来说并没有太多识别问题的作用。那么这是来自哪个工具链呢? - WhozCraig
2
@WhozCraig,无论是GCC还是Clang都会给出类似的错误信息。而MSVC则更差劲,只会说“语法错误:‘)’”。但这个错误信息是完全正确的(或许不太容易理解),在一元“*”运算符之后应该有一个表达式。 - user17732522
2
在现代C++中,显式使用new是一种不好的实践。在这种情况下,你应该使用std::vector<int>或者std::array<int, 10> - Marek R
显示剩余3条评论
1个回答

15

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

new的无初始化语法可以是以下两种形式之一:

new (type)
或者
new type
在第二种情况下,type可能不包含括号。这也可以在上面链接的页面中进行演示: 在第二种情况下,type可能不包含括号。这也可以在上述链接页面中看到。
new int(*[10])();    // error: parsed as (new int) (*[10]) ()
new (int (*[10])()); // okay: allocates an array of 10 pointers to functions
对于你的情况,这意味着:

auto p = new int (*)[10];     // error: parsed as (new int) ((*)[10])
auto p = new ( int (*)[10] ); // ok
当您使用别名时,可以编写:
auto p = new array *;

因为这里的type不包含括号。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接