"x = new(Foo)"和任意 Foo 的"x = new Foo"一样吗?

Is "x = new(Foo)" the same as "x = new Foo" for an arbitrary Foo?

本文关键字:Foo new 一样 任意      更新时间:2023-10-16

我正在查看一些遗留代码,并遇到了x=new(Foo);(注意所提供的类型周围的括号)。我测试了变化,它似乎与x=new Foo;相同

Foo是非pod数据结构。一些外部内存泄漏程序正在标记这条线——它正在为CORBA out参数分配内存,因此调用者应该负责删除,但这是一个与许多间接层分开的问题。

我的分析是正确的,它是可以接受的风格吗?

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

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

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

令人困惑的是,sizeof操作符在传递类型名称时需要父节点,而在传递表达式时不需要父节点。我个人认为这是不一致的,我不会选择把它推广到语言的其他部分。

如果类型名称中有圆括号,则必须用圆括号括起来。其他类型也可以包括在内。

需要括号的例子:

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

From cppreference.com: new expression