从这里answer , 在 C++03 中,如果 ()
被省略,POD 类型将被默认初始化,否则它是值初始化的。
// POD type
struct foo {
int x;
};
// value-initialized
new foo();
但是如果提供了用户定义的构造函数,下面的任何对象是否将被视为默认对象或值初始化对象?
// non-POD type
struct bar {
bar(int x = 0):x(x) {}
int x;
};
new bar();
new bar(42);
最佳答案
In C++03, a POD type gets default initialized if () is omitted otherwise it is value-initialized.
事实并非如此。根据 C++03 规范第 8.5/9 节,如果没有为非静态 POD 类型对象指定初始值设定项,则它及其子对象“具有不确定的初始值”。这与默认初始化不是一回事。默认初始化与 POD 类型的值初始化相同,这意味着对象是零初始化的 (8.5/5),但这只能在存在空初始化器(即空括号)的情况下发生每 8.5/7)。因此,您只能使用空初始化程序默认和/或值初始化 POD 类型。如果未指定初始化程序,则不会发生非静态 POD 类型的默认初始化。
在您的第二个示例中,对于具有用户定义的构造函数的非 POD 类型,如果您省略值初始化器(括号)符号,则从技术上讲默认初始化将发生。换句话说:
bar* ptr_a = new bar; //default initialization
bar* ptr_b = new bar(); //value initialization
请记住,对于非 POD 结构或类类型,如果有用户定义的构造函数、默认初始化和值初始化,根据 8.5/5,两者都会调用用户定义的构造函数。所以最后,对于您声明的 bar
类型,默认和值初始化最终会做同样的事情。
关于c++ - 默认初始化与值初始化,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8203615/