首先,您从 的值初始化实例复制初始化 。来自 C++03 标准,§8.5/7:a
MyClass
初始值设定项为空括号集的对象,即 (),应进行值初始化。
从 §8.5/5 开始:
对类型对象进行值初始化T
意味着:
- if
T
是具有用户声明的构造函数的类类型,则调用 for 的默认构造函数(如果没有可访问的默认构造函数T
,则初始化格式错误);T
- 如果
T
是没有用户声明的构造函数的非联合类类型,则每个非静态数据成员和基类组件T
都是值初始化的;
- 如果
T
是数组类型,则每个元素都是值初始化的;
- 否则,对象被零初始化
对类型对象进行零初始化T
意味着:
- 如果
T
是标量类型,则将对象设置为0
(零)转换为的值T
;
- 如果
T
是非联合类类型,则每个非静态数据成员和每个基类子对象都进行零初始化;
- 如果
T
是联合类型,则对象的第一个命名数据成员)为零初始化;
- 如果
T
是数组类型,则每个元素都初始化为零;
- 如果
T
是引用类型,则不执行初始化。
在第二种情况下,如果不是 POD 类型,则以一种b
会导致它为default-initialize的方式声明——第 8.5/5 节:MyClass
默认初始化T类型的对象意味着:
- 如果
T
是非 POD 类类型,T
则调用T
的默认构造函数(如果没有可访问的默认构造函数,则初始化为非良构);
- 如果
T
是数组类型,则每个元素都是默认初始化的;
- 否则,对象被零初始化。
但是,因为MyClass
是 POD 类型,b
所以未初始化——第 8.5/9 节:
如果没有为对象指定初始化程序,并且该对象是(可能是 cv 限定的)非 POD 类类型(或其数组),则该对象应默认初始化;如果对象是 const 限定类型,则基础类类型应具有用户声明的默认构造函数。否则,如果没有为非静态对象指定初始化器,则该对象及其子对象(如果有)具有不确定的初始值;如果对象或其任何子对象是 const 限定类型,则该程序是非良构的。