我遇到了以下代码
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]"一样吗?
以下是两种语法结构,直接来自[C++11: 5.3.4]:
new-expression:
::optnewnew-placement opt new-type-id new-initializer opt
::optnewnew-placement opt(type-id)new-initializer opt
你习惯了前者但遇到了后者.让我们仔细看看那个; 什么是type-id,它与new-type-id有什么不同?
[C++11: 5.3.4/3]:该新型-ID在一个新的表达是可能的最长序列的新声明符. [注意:这可以防止声明者运算符&,&&,*和[]及其表达式对应物之间存在歧义. - 尾注] [示例:Run Code Online (Sandbox Code Playgroud)new int * i; // syntax error: parsed as (new int*) i, not as (new int)*i*是指针声明符,而不是乘法运算符. - 末端的例子]
所以,你看,这就是为什么new (int(*[10]))有效但new int(*[10])不是:外括号允许5.3.4/3开始.
这实际上在下面的段落中解决,在与你的例子非常类似的例子中内括号的有效性:
[C++11: 5.3.4/4]:[注:在括号新型-ID一个的新的表达可以有意想不到的效果.[例如:Run Code Online (Sandbox Code Playgroud)new int(*[10])(); // error因为绑定是错误的
Run Code Online (Sandbox Code Playgroud)(new int) (*[10])(); // error相反,new运算符的显式括号版本可用于创建复合类型的对象(3.9.2):
Run Code Online (Sandbox Code Playgroud)new (int (*[10])());为函数分配一个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)