我正在查看一些遗留代码,并遇到了x=new(Foo);
(注意围绕所提供的类型的括号)。我测试了变体,它看起来与x=new Foo;
相同对于任意Foo,“x = new(Foo)”与“x = new Foo”相同吗?
Foo是一个非POD数据结构。一些外部内存泄漏程序正在标记该行 - 它为CORBA输出参数分配内存,因此调用者应该照顾删除操作,但这与许多间接层有关。
我的分析是否正确,是否可以接受?
我正在查看一些遗留代码,并遇到了x=new(Foo);
(注意围绕所提供的类型的括号)。我测试了变体,它看起来与x=new Foo;
相同对于任意Foo,“x = new(Foo)”与“x = new Foo”相同吗?
Foo是一个非POD数据结构。一些外部内存泄漏程序正在标记该行 - 它为CORBA输出参数分配内存,因此调用者应该照顾删除操作,但这与许多间接层有关。
我的分析是否正确,是否可以接受?
如果该类型的名称带括号,则必须用圆括号括起来。其他类型也可以包含在内。
例如当需要括号:
new int(*[10])(); // parser error: parsed as (new int) (*[10])()
new (int (*[10])()); // OK: allocates an array of 10 pointers to functions
这是正确的,但风格至少与众不同。
有时允许围绕完整类型名称的括号,但在这种情况下是无关紧要的。这就像将括号放在不需要的表达式附近。也许是最接近的类比是
return(0); /* looks like a function, but isn't */
令人困惑的是,在括号是必需的sizeof
运营商,通过它当一个类型名称,但不是传递一个表达式时。就我个人而言,我认为这是不一致的,并且不会选择将其传播到其他语言。
这就是我想太多,但事实证明,它必须比这更微妙。例如,下面的代码不能编译:'(int)main(){return 0; }'。 –
不正确,通常不允许使用类型的括号。 – zch
@zch然后,是否有一个(没有参考砰砰声,虽然我感觉到这一点)短括号括号*是*允许类型周围吗? – 2013-01-16 00:33:20