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

joe*_*ney 8 c++ syntax new-operator

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

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

我的分析是否正确,是否可以接受?

Pot*_*ter 10

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

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

return( 0 ); /* looks like a function, but isn't */
Run Code Online (Sandbox Code Playgroud)

令人困惑的是sizeof,当传递一个类型名称而不是传递表达式时,操作符需要操作符.我个人认为这是一种不一致,并且不会选择将其传播到其他语言.

  • 这也是我的想法,但事实证明它必须比那更微妙.例如,以下代码无法编译:`(int)main(){return 0; }`. (4认同)
  • 不正确,通常不允许围绕类型括号. (3认同)
  • @zch然后,是否有一个(没有参考重击,虽然我感觉到了这一点)括号*是*允许在类型周围的短列表? (2认同)

Csq*_*Csq 5

如果类型的名称带有括号,则必须将其括在括号中.其他类型也可以包含在内.

需要括号的示例:

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

来自cppreference.com:新表达