Default-initialization
这是在对象以无初始化器方式构造时执行的初始化过程。
目录 |
语法
T 对象
;
|
(1) | ||||||||
new
T
|
(2) | ||||||||
说明
默认初始化在三种情况下执行:
默认初始化的效果是:
-
若
T是(可能带有 cv 限定符的) 非 POD (C++11 前) 类类型,将考虑构造函数并通过 重载决议 匹配空参数列表。所选构造函数(即 默认构造函数 之一)将被调用来为新对象提供初始值; -
若
T是数组类型,数组的每个元素都将进行默认初始化; - 否则,不执行任何初始化(参见 注释 )。
|
当未使用初始化器时,只有(可能带有 cv 限定符的)非 POD 类类型(或其数组)具有自动存储期才会被视为默认初始化。标量和具有动态存储期的 POD 类型被视为未初始化(自 C++11 起,这种情况被重新分类为默认初始化的一种形式)。 |
(C++11 前) |
|
(C++11 前) |
| (C++11 起) |
T
的每个
潜在构造
基类是 const 默认可构造的。
不确定值和错误值
|
当获取具有自动或动态存储期的对象的存储时,该对象具有 不确定值 。 如果对象未执行任何初始化,则该对象保留不确定值,直到该值被替换。 |
(C++26 前) |
|
当获取具有自动或动态存储期的对象的存储时,组成该对象存储的字节具有以下初始值:
如果对象(包括 子对象 )未执行任何初始化,则此类字节保留其初始值,直到该值被替换。
|
(C++26 起) |
如果求值产生不确定值,则行为是 未定义 的。
|
如果求值产生错误值,则行为是 错误 的。 |
(C++26 起) |
特殊情况
以下类型是 未初始化友好 的:
| (C++17 起) |
- unsigned char
- char ,如果其底层类型是 unsigned char
给定不确定 或错误 (C++26 起) 值 value , value 的 未初始化结果值 是:
- 不确定值,如果 value 也是不确定值。
|
(C++26 起) |
如果求值 eval 产生未初始化友好类型的不确定 或错误 (C++26 起) 值 value ,则在以下情况下行为是良定义的:
- eval 是以下表达式及其操作数的求值:
- 在这种情况下,操作的结果是 value 的未初始化结果值。
- eval 是 简单赋值运算符 的右操作数的求值,其左操作数是未初始化友好类型的左值。
- 在这种情况下,左操作数引用的对象的值被替换为 value 的未初始化结果值。
- eval 是初始化未初始化友好类型对象时的初始化表达式的求值。
| (C++17 起) |
- 在这种情况下,该对象被初始化为 value 的未初始化结果值。
转换未初始化友好类型的不确定值会产生不确定值。
|
转换未初始化友好类型的错误值会产生错误值,转换结果是转换后操作数的值。 |
(C++26 起) |
// 情况 1:具有动态存储期的未初始化对象 // 所有 C++ 版本:不确定值 + 未定义行为 int f(bool b) { unsigned char* c = new unsigned char; unsigned char d = *c; // OK,“d”具有不确定值 int e = d; // 未定义行为 return b ? d : 0; // 如果“b”为 true 则未定义行为 } // 情况 2:具有自动存储期的未初始化对象 // C++26 前:不确定值 + 未定义行为 // C++26 起:错误值 + 错误行为 int g(bool b) { unsigned char c; // “c”具有不确定/错误值 unsigned char d = c; // 无未定义/错误行为, // 但“d”具有不确定/错误值 assert(c == d); // 成立,但两个整型提升具有 // 未定义/错误行为 int e = d; // 未定义/错误行为 return b ? d : 0; // 如果“b”为 true 则未定义/错误行为 } // 同情况 2 void h<span class="