operator是指针数组的新语法

Ale*_*der 2 c++

我遇到了以下代码

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

我还没有设法解析"new(int(*[10]))"行.我习惯了标准语法"new int*[10]",并对上面的一个感到惊讶.

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

Lig*_*ica 7

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

new-expression:
::opt new new-placement opt new-type-id new-initializer opt
::opt new new-placement opt ( type-id ) new-initializer opt

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

[C++11: 5.3.4/3]:新型-ID在一个新的表达是可能的最长序列的新声明符. [注意:这可以防止声明者运算符&,&&,*和[]及其表达式对应物之间存在歧义. - 尾注] [示例:

new int * i; // syntax error: parsed as (new int*) i, not as (new int)*i
Run Code Online (Sandbox Code Playgroud)

*是指针声明符,而不是乘法运算符. - 末端的例子]

所以,你看,这就是为什么new (int(*[10]))有效但new int(*[10])不是:外括号允许5.3.4/3开始.

这实际上在下面的段落中解决,在与你的例子非常类似的例子中内括号的有效性:

[C++11: 5.3.4/4]: [注:在括号新型-ID一个的新的表达可以有意想不到的效果.[例如:

new int(*[10])(); // error
Run Code Online (Sandbox Code Playgroud)

因为绑定是错误的

(new int) (*[10])(); // error
Run Code Online (Sandbox Code Playgroud)

相反,new运算符的显式括号版本可用于创建复合类型的对象(3.9.2):

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

为函数分配一个10个指针的数组(不带参数并返回int.) - 最后的例子]

- 尾注]

在您的情况下,虽然您使用的是指针而不是指向函数的指针(请注意()上面引用示例中的附加内容),但您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.
Run Code Online (Sandbox Code Playgroud)

(使用geordi)