对于任意Foo,“x = new(Foo)”与“x = new Foo”相同吗?

时间:2013-01-16 00:24:02

标签: c++ syntax new-operator

我正在查看一些遗留代码并遇到x=new(Foo);(请注意所提供类型的括号)。我测试了变体,它看起来与x=new Foo;

相同

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

我的分析是否正确且风格可接受?

2 个答案:

答案 0 :(得分:10)

这是正确的,但风格至少是不寻常的。

有时允许使用完整类型名称的括号,但在这种情况下是无关紧要的。这就像在不需要的表达式周围加上括号。也许最接近的类比是

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

令人困惑的是,sizeof运算符在传递类型名称时需要使用parens,但在传递表达式时则不需要。就个人而言,我认为这是一种不一致,并且不会选择将其扩展到其他语言。

答案 1 :(得分: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 expression