operator是指针数组的新语法

时间:2014-10-25 18:59:38

标签: c++

我遇到了以下代码

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]))"是正确的,与#34; new int * [10]"?

相同

1 个答案:

答案 0 :(得分:7)

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

  

新表达
    :: opt new new-placement opt new-type-id 新初始化 <子>选择
    :: opt new new-placement opt ( type-id ) new-initializer opt

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

  

[C++11: 5.3.4/3]: new-expression 中的 new-type-id 新声明符的最长序列。 [注意:这可以防止声明者操作符&amp;,&amp;&amp;,*和[]及其表达式对应物之间的歧义。 -end note] [例如:

new int * i; // syntax error: parsed as (new int*) i, not as (new int)*i
     

*是指针声明符,而不是乘法运算符。 -end example]

所以,你知道,这就是new (int(*[10]))有效但new int(*[10])不是这样的原因:外括号允许5.3.4/3启动。

这实际上在下面的段落中解决,例如 very 中的内括号的有效性与你的相似:

  

[C++11: 5.3.4/4]: [注意 new-expression new-type-id 中的括号可能会产生惊人的效果。 [例如:

new int(*[10])(); // error
     由于绑定是

格式不正确

(new int) (*[10])(); // error
     

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

new (int (*[10])());
     

为函数分配一个包含10个指针的数组(不带参数并返回int。) -end example]

     

-end note]

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

最后,int (*[10])int* [10]相同,因为它只是 type-id 结构的语法是如何工作的:< / p>

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

(使用geordi