gpt4 book ai didi

c++ - 默认初始化与值初始化

转载 作者:塔克拉玛干 更新时间:2023-11-03 00:31:31 51 4
gpt4 key购买 nike

从这里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/

51 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com