c++ - 关于对象初始化语义的问题

标签 c++ standards

我一直想知道 C++03 规范中围绕对象初始化的语言,特别是第 8.5 节第 9 段,其中指出,

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

我要特别注意子句,“否则,如果没有为非静态指定初始化器 对象,对象及其子对象(如果有)具有不确定的初始值”。根据第 8.5 节第 5 段,默认初始化的定义分为三种情况:

  1. 如果 T 是非 POD 类类型(第 9 条),则调用 T 的默认构造函数(并且初始化是 如果 T 没有可访问的默认构造函数,则格式错误)
  2. 如果 T 是数组类型,则每个元素都被默认初始化
  3. 否则,对象被零初始化。

据我了解,第 9 段说明如果我们有一个没有初始化器的非 POD 类类型,那么将调用它的默认构造函数。我感到困惑的是在 POD 类类型的情况下会发生什么......从我强调的条款来看,似乎没有提到 POD 类类型需要默认构造函数调用。然而,如果我创建了一个 POD 类类型,例如

struct POD_class
{
    int a;
    int b;
    POD_class() { cout << "Default constructor called" << endl; }
};

int main()
{
    POD_class test;
    return 0;
}

POD_class 的默认构造函数似乎在使用g++ 编译和运行这段代码时被调用。因此,即使 POD_class 没有特定的初始化器,它似乎仍然是默认初始化的,根据默认初始化定义中的案例#1,因为调用了该类型的默认构造函数。

基于上述情况,我的问题是:对于 POD 类,是否默认初始化一个对象,因为第 9 段提到的非静态 POD 类意味着它的默认构造函数是没有被调用,或者它根本没有被零初始化?

最佳答案

您的 POD_class 实际上不是 POD 类。 POD 类不能有用户声明的构造函数。

关于c++ - 关于对象初始化语义的问题,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7033148/

相关文章:

C++ Visual Studio Express - 分配返回值失败函数

javascript - 允许重复的属性名称的目的是什么?

javascript - 对象或数组的首选声明约定是什么 : const or let?

c# - 如何将包含可变大小数组的结构编码到 C#?

c++ - Linux C++ 二进制命名空间

c++ - 查找指向数组最大值的指针

java - 返回在各种语言的函数中创建的数组和对象

javascript - Angular 和语义标记/关注点分离

c - 像 kbhit 这样的标准函数是什么?

c++ - 为什么 const 引用会延长右值的生命周期?