我遇到了以下代码
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]"?
相同答案 0 :(得分:7)
以下是两个语法结构,直接来自[C++11: 5.3.4]
:
新表达:
::
optnew
new-placement opt new-type-id 新初始化 <子>选择子>
::
optnew
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)