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

Jas*_*son 1 c++ standards

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

"如果没有为对象指定初始化程序,并且该对象具有(可能是cv限定的)非POD类类型(或其数组),则该对象应默认初始化;如果该对象具有const限定类型,底层类类型应具有用户声明的默认构造函数.否则,如果没有为非静态对象指定初始化程序,则该对象及其子对象(如果有)具有不确定的初始值;如果该对象或其任何子对象是const-qualified类型,该程序是不正确的."

我想特别注意该子句,"否则,如果没有为非静态对象指定初始化器,则该对象及其子对象(如果有)具有不确定的初始值".根据第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;
}
Run Code Online (Sandbox Code Playgroud)

POD_class编译和运行此代码时,似乎调用了默认构造函数g++.因此,即使POD_class没有特定的初始化程序,它似乎仍然是默认初始化的,默认初始化定义中的情况#1,因为调用了该类型的默认构造函数.

基于上述情况,这里是我的问题:对于一个POD类,并没有默认初始化一个对象作为第9段提到的非静态POD类意味着它的默认构造函数不叫,或者说,它根本就不是零初始化?

Jam*_*lis 5

POD_class实际上不是POD课程.POD类不能具有用户声明的构造函数.