这取决于条件。
如果x
是零初始化,则填充的位为零,因此这种情况定义良好(C++14 的 8.5/6):
对 T 类型的对象或引用进行零初始化意味着:
— 如果 T 是标量类型(3.9),则将对象初始化为通过转换整数文字获得的值
0(零)到 T;105
— 如果 T 是(可能是 cv 限定的)非联合类类型,则每个非静态数据成员和每个基类
子对象初始化为零,填充初始化为零位;
— 如果 T 是(可能是 cv 限定的)联合类型,则对象的第一个非静态命名数据成员为零-
初始化和填充被初始化为零位;
— 如果 T 是数组类型,则每个元素都初始化为零;— 如果 T 是引用类型,则不执行初始化。
但是,如果x
是默认初始化的,则未指定填充,因此它具有不确定的值(由此处未提及填充这一事实推断)(8.5/7):
默认初始化 T 类型的对象意味着:
— 如果 T 是(可能是 cv 限定的)类类型(第 9 条),则调用 T 的默认构造函数(12.1)(如果 T 没有默认构造函数或重载决议(13.3)导致初始化是非良构的)歧义或在初始化上下文中删除或无法访问的函数中);
— 如果 T 是数组类型,则每个元素都是默认初始化的;
— 否则,不执行初始化。
并且在这种情况下比较不确定值是UB,因为没有提到的例外适用,因为您将不确定值与某物(8.5/12)进行比较:
如果没有为对象指定初始化器,则该对象是默认初始化的。当获得具有自动或动态存储持续时间的对象的存储时,该对象具有一个不确定的值,如果没有对该对象执行初始化,该对象将保留一个不确定的值,直到该值被替换(5.17)。[ 注意:具有静态或线程存储持续时间的对象是零初始化的,请参见 3.6.2。— 尾注]如果评估产生不确定的值,则行为未定义,但以下情况除外:
— 如果通过以下评估产生无符号窄字符类型 (3.9.1) 的不确定值:
......- 条件表达式 (5.16) 的第二个或第三个操作数,
……——逗号表达式的右操作数(5.18),
......- 强制转换或转换为无符号窄字符类型(4.7、5.2.3、5.2.9、5.4)的操作数,
或者
......——一个弃值表达式(第 5 条),那么运算的结果是一个不确定的值。
— 如果通过对简单赋值运算符 (5.17) 的右操作数的求值产生无符号窄字符类型的不确定值,其第一个操作数是无符号窄字符类型的左值,则不确定值替换引用的对象的值由左操作数。
— 如果在初始化无符号窄字符类型的对象时,初始化表达式的评估产生了无符号窄字符类型的不确定值,则该对象被初始化为不确定值。