类型名称后的括号是否与new有区别?

问题描述

让我们学究一点,因为有一些差异实际上会影响代码的行为。以下大部分内容摘自对一篇“新旧事物”文章评论。 有时,新操作符返回的内存将被初始化,有时则不取决于您要更新的类型是POD(纯旧数据),还是包含POD成员并使用编译器生成认构造函数的类。 在C1998中,有两种类型的初始化:零和认 在C2003中,添加了第三种类型的初始化,即值初始化。 假设:

struct A { int m; }; // POD
struct B { ~B(); int m; }; // non-POD, compiler generated default ctor
struct C { C() : m() {}; ~C(); int m; }; // non-POD, default-initialising m

在C++98编译器中,应发生以下情况: new A-不确定值 new A()-零初始化 new B-认构造(B::m未初始化) new B()-认构造(B::m未初始化) new C-认构造(C::m初始化为零) new C()-认构造(C::m为零初始化)

在符合C03的编译器中,情况应该是这样的: new A-不确定值 new A()-值initialize A,这是零初始化,因为它是一个POD。 new B-认初始化(使B::m未初始化) new B()-value初始化B,该值为零初始化所有字段,因为它的认ctor是编译器生成的,而不是用户定义的。 new C-default初始化C,它调用认的ctor。 new C()-value初始化C,它调用认的ctor。 因此,在所有版本的C中,new a和new a()之间都有区别,因为a是一个POD。 对于case new B(),C98和C03之间的行为有所不同。 这是C++的一个尘土飞扬的角落,会让你发疯。在构建一个对象时,有时你想要/需要paren,有时你绝对不能拥有它们,有时这并不重要。

解决方法

如果“测试”是一个普通类,那么以下两者之间是否有任何区别:

Test* test = new Test;

and

Test* test = new Test();