gpt4 book ai didi

c++ - 指针数组的运算符新语法

转载 作者:搜寻专家 更新时间:2023-10-30 23:56:56 25 4
gpt4 key购买 nike

我遇到了下面的代码

int main() {
int **objects;
objects=new (int(*[10])); // seems to be equal to new int*[10];
delete[] objects;
return 0;
}

我还没有设法解析“new (int(*[10]))”这一行。我习惯了标准语法“new int*[10]”,对上面的语法感到非常惊讶。

你能解释一下为什么这个“new (int(*[10]))”是正确的并且和“new int*[10]”一样吗?

最佳答案

下面是两种语法结构,直接来自 [C++11: 5.3.4]:

new-expression:
::optnew new-placementopt new-type-id new-initializeropt
::optnew new-placementopt( type-id ) new-initializeropt

你习惯了前者,却遇到了后者。让我们仔细看看那个; type-id 是什么?它与new-type-id 有何不同?

[C++11: 5.3.4/3]: 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 ]

所以,你看,这就是为什么 new (int(*[10])) 有效但 new int(*[10]) 无效的原因:外括号允许 5.3.4/3 启动。

这实际上在以下段落中得到了解决,示例中内括号的有效性与您的示例非常相似:

[C++11: 5.3.4/4]: [ 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 ]

在您的情况下,虽然您使用的是指针而不是指向函数的指针(请注意上面引用示例中的附加 ()),但您的 int (*[10]) 仍然是复合类型,因此适用相同的逻辑。

最后,int (*[10])int* [10] 相同,因为就是:这就是type-id 结构的语法有效:

<tomalak> << TYPE_DESC<int (*[10])>;
<geordi> array of 10 pointers to integers
<tomalak> << TYPE_DESC<int* [10]>;
<geordi> Same output.

(使用 geordi)

关于c++ - 指针数组的运算符新语法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/26566090/

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