值初始化是 C++98 标准的一部分吗?如果不是,为什么在 C++03 标准中添加它
Is value initialization part of the C++98 standard? If not, why was it added in the C++03 standard?
干杯和hth。 - Alf 在此答案中评论说,与 C++98 相比,值初始化可以说是 C++03 的新功能。我想知道他是什么意思。
值初始化是 C++98 的一部分吗?它存在于概念中而不是名称中吗?为什么将其添加到 C++03 标准中?
我有一份 '03 标准的副本,但没有 '98 标准的副本。下面是默认初始化和值初始化的定义。
默认初始化 T 类型的对象意味着:
— 如果 T 是非 POD 类类型(子句 9(,则默认构造函数为 调用 T(如果 T 没有,则初始化格式不正确 可访问的默认构造函数(;
— 如果 T 是数组类型,则每个元素都是默认初始化的;
— 否则,对象初始化为零。
对 T 类型的对象进行值初始化意味着:
— 如果 T 是类类型 (条款 9( 使用用户声明的构造函数 (12.1(,则默认 调用 T 的构造函数(如果 T 初始化格式不正确( 没有可访问的默认构造函数(;
— 如果 T 是非联合类 类型没有用户声明的构造函数,然后每个非静态数据 T 的成员和基类组件被值初始化;
— 如果 T 是 数组类型,然后对每个元素进行值初始化;
— 否则, 对象初始化为零
我的猜测是,'98 有默认初始化但没有值初始化,两者之间存在一些关键差异。老实说,我在这里解析标准语言时遇到了麻烦,我不明白定义之间的区别。
引用ISO/IEC 14882:1998标准文件(已从ISO撤回(:
默认初始化类型
T
的对象意味着:
- 如果 T 是非 POD 类类型(子句 9(,则调用
T
的默认构造函数(如果T
没有 可访问的默认构造函数(;- 如果 T 是数组类型,则每个元素都是默认初始化的;
- 否则,对象的存储初始化为零。
在第7段中:
初始值设定项是一组空括号(即
()
(的对象应默认初始化。
有关更改背后的基本原理的详细信息,请参阅实现更改的缺陷报告:
此定义适用于局部变量,但不适用于 由于执行 的表达式而初始化的对象 形式
T()
,因为由此类表达式生成的对象将 立即复制,因此应具有 确保可复制。
为此,我建议增加 在8.5第5段的新案文之后:对类型为
T
的对象进行值初始化意味着:
- 如果 T 是具有用户声明构造函数 (12.1( 的类类型(子句 9 [class](,则调用 T 的默认构造函数(和 如果 T 没有可访问的默认值,则初始化格式不正确 构造函数(;
- 如果 T 是没有用户声明构造函数的类类型,则 T 的每个非静态数据成员和基类组件都是 值初始化;
- 如果 T 是数组类型,则每个元素都是值初始化的;
- 否则,对象的存储初始化为零。
此外,我建议将"默认初始化"更改为 5.2.3 第 2 段中的"值初始化"。
之后,历史解释:
古代史
曾几何时,一位名叫劳拉·伊夫斯(Laura Eaves(的AT&T编译器开发人员问道。 我:"
int()
的价值应该是多少?我的第一个想法是 它应该与x
说完后的值相同int x;
但我很快意识到这个定义是行不通的。原因是 x 具有不确定的值(假设它是局部值( 变量(,但我们不介意
x
是不确定的,因为我们是 大概是在我们使用之前为x
分配一个值。相比之下,int()
最好不要有一个不确定的值,因为复制 这样的值具有未定义的影响。禁止 编译器在编译期间标记int()
,只是为了允许它 在执行过程中标记它![...]
- 如果不包含 pthread,为什么 GCC 的线程标准库实现会抛出异常?
- 无法重置 std::shared_ptr 标准::设置<>中的对象...为什么?
- 为什么标准首选圆括号初始化为"make_<something>"?
- 为什么inv_sqrt2没有在C++标准库中定义?
- 为什么 C++ 标准库中没有 SIMD 功能?
- 双重标准?为什么只有 char* const&a = "bla" 的警告?
- 为什么我们在C++标准中没有"const 迭代器",而是const_iterator?
- 为什么C++标准库容器函数 empty() 标记为 [[nodiscard]]?
- 为什么此代码从标准输入中少一个输入?
- 为什么没有标准::uses_allocator<标准::可选>?
- 如果有标准::屏障,为什么是 std::闩锁?
- 为什么许多标准库类型在 C++20 中删除 operator!=?
- 为什么标准关联有序容器允许"const char*"作为其键?
- 为什么我的 RLE 代码显示标准超出 C++ 的范围?
- 为什么是标准::未来不阻塞
- 为什么标准不允许通过引用捕获不完整的异常类型?
- 为什么我的程序说长度函数不在我的标准库中?
- 在 C++11 标准中,为什么要依赖 char 类型实现?
- 为什么 C++17 标准没有带来部分类模板参数扣除?
- 为什么使用标准类型作为模板参数?