对于任意的Foo,"x = new(Foo)" 和 "x = new Foo" 是相同的吗?

8

我正在查看一些旧代码,发现了x=new(Foo);(请注意提供的类型周围的括号)。 我尝试了一些变化,似乎与x=new Foo;相同。

Foo是一个非POD数据结构。一些外部内存泄漏程序正在标记该行 - 它正在为CORBA输出参数分配内存,因此调用者应该负责删除,但这是一个具有多层间接性的单独问题。

我的分析正确吗?这样的编码风格是否可接受?

2个回答

10

这种写法理论上是正确的,但至少不太常见。

在完整的类型名称周围添加括号有时是允许的,但在这种情况下是多余的。这就好像在不需要的地方将表达式括起来一样。也许最接近的类比可能是

return( 0 ); /* looks like a function, but isn't */

令人困惑的是,在向 sizeof 操作符传递类型名称时需要使用括号,但在传递表达式时不需要。个人认为这是一种不一致性,并且不会选择将其推广到语言的其余部分。


4
我原本也是这么想的,但事实证明情况可能比这更微妙。例如,以下代码无法编译:(int) main() { return 0; } - Oliver Charlesworth
3
不正确,类型周围的括号通常是不允许的。 - zch
2
@zch那么,有没有一个(不带参考敲打,尽管我感觉这是必要的)简短的列表,说明什么时候可以在类型周围使用括号? - user166390
@pst 我不知道任何其他例子,这是我记得的第一个例子。 - zch
我认为 new 可能允许额外的括号来区分未加括号的类型名称和表达式的其余部分,但实际上它遵循最大匹配原则。嗯... - Potatoswatter
显示剩余2条评论

5

如果类型名称中有括号,则必须用括号将其括起来。其他类型也可以被括起来。

需要使用括号的示例:

new int(*[10])();    // parser error: parsed as (new int) (*[10]) ()
new (int (*[10])()); // OK: allocates an array of 10 pointers to functions

来自cppreference.com:new表达式


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接