POD 与非 POD 类类型的默认初始化

发布于 2024-12-17 17:14:18 字数 601 浏览 2 评论 0原文

C++ 标准表示 (8.5/5):

默认初始化T类型的对象意味着:

  • 如果 T 是非 POD 类类型(第 9 条),则调用 T 的默认构造函数(如果T 没有 可访问的默认构造函数)。

  • 如果T是数组类型,则每个元素都默认初始化。

  • 否则,该对象将被零初始化。

使用此代码,

struct Int { int i; };

int main()
{
    Int a;
}

对象 a 被默认初始化,但显然 ai 不一定等于 0 。这是否与标准相矛盾,因为 Int 是 POD 而不是数组?

编辑class更改为struct,以便Int是一个POD。

The C++ standard says (8.5/5):

To default-initialize an object of type T means:

  • If T is a non-POD class type (clause 9), the default constructor for T is called (and the initialization is ill-formed if T has no
    accessible default constructor).

  • If T is an array type, each element is default-initialized.

  • Otherwise, the object is zero-initialized.

With this code

struct Int { int i; };

int main()
{
    Int a;
}

the object a is default-initialized, but clearly a.i is not necessarily equal to 0 . Doesn't that contradict the standard, as Int is POD and is not an array ?

Edit Changed from class to struct so that Int is a POD.

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(3

紫罗兰の梦幻 2024-12-24 17:14:18

从2003年标准的8.5.9开始:

如果没有为对象指定初始值设定项,并且该对象是
(可能是 cv 限定的)非 POD 类类型(或其数组),
对象应默认初始化;如果该物体是
const 限定类型,基础类类型应具有
用户声明的默认构造函数。 否则,如果没有初始化程序
为非静态对象指定,该对象及其子对象,如果
任意,具有不确定的初始值
);如果该对象或任何
它的子对象是 const 限定类型,该程序格式错误。

您显示的类是 POD,因此突出显示的部分适用,并且您的对象根本不会被初始化(因此您引用的第 8.5/5 节根本不适用)。

编辑:根据您的评论,这里引用当前标准最终工作草案第 8.5/5 节(我没有真正的标准,但 FDIS 据说非常接近):

默认初始化 T 类型的对象意味着:

——如果 T 是一个(可能
cv 限定的)类类型(第 9 条),T 的默认构造函数是
调用(如果 T 没有可访问的,则初始化是错误的
默认构造函数);

——如果T是数组类型,则每个元素是
默认初始化;

否则不执行初始化。

From 8.5.9 of the 2003 standard:

If no initializer is specified for an object, and the object is of
(possibly cv-qualified) non-POD class type (or array thereof), the
object shall be default-initialized; if the object is of
const-qualified type, the underlying class type shall have a
user-declared default constructor. Otherwise, if no initializer is
specified for a nonstatic object, the object and its subobjects, if
any, have an indeterminate initial value
); if the object or any of
its subobjects are of const-qualified type, the program is ill-formed.

The class you show is a POD, so the highlighted part applies, and your object will not be initialized at all (so section 8.5/5, which you quote, does not apply at all).

Edit: As per your comment, here the quote from section 8.5/5 of the final working draft of the current standard (I don't have the real standard, but the FDIS is supposedly very close):

To default-initialize an object of type T means:

— if T is a (possibly
cv-qualified) class type (Clause 9), the default constructor for T is
called (and the initialization is ill-formed if T has no accessible
default constructor);

— if T is an array type, each element is
default-initialized;

otherwise, no initialization is performed.

妥活 2024-12-24 17:14:18

您的变量未初始化。
用于

Int a = Int();

初始化您的 POD 或声明标准构造函数以使其成为非 POD;
但出于性能原因,您也可以使用未初始化的 POD,例如:

Int a;
a.i = 5;

Your variable is not initialized.
Use

Int a = Int();

to initialize your POD or declare a standard constructor to make it non POD;
But you can also use your POD uninitialized for performance reasons like:

Int a;
a.i = 5;
尸血腥色 2024-12-24 17:14:18

不,对象 a 未默认初始化。如果你想默认初始化它,你必须说:

Int a = Int() ;

No, the object a is not default-initialized. If you want to default-initialize it, you have to say:

Int a = Int() ;
~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文