干杯和hth。 - Alf在这个answer中发表评论,与C ++ 98相比,值初始化可以说是C ++ 03的一个新特性。我不知道他的意思。
{+ 3}}是C ++ 98的一部分吗?它是出现在概念中而不是名义上吗?为什么它被添加到C ++ 03标准中?
我有一份 03标准的副本,但没有' 98标准。这是默认初始化和值初始化的定义。
默认初始化T类型的对象意味着:
- 如果T是非POD类类型(第9节),则为默认构造函数 调用T(如果T没有,则初始化是错误的 access default constructor);
- 如果T是数组类型,则每个元素都是默认初始化的;
- 否则,该对象为零初始化。
对T类型的对象进行值初始化意味着:
- 如果T是类类型 (第9节)用户声明的构造函数(12.1),然后是默认值 调用T的构造函数(如果T,初始化是错误的 没有可访问的默认构造函数);
- 如果T是非联盟类 没有用户声明的构造函数的类型,然后是每个非静态数据 T的成员和基类组件是值初始化的;
- 如果T是 一个数组类型,然后每个元素都是值初始化的;
- 否则, 该对象是零初始化
我的猜测是' 98具有默认初始化但没有值初始化,并且两者之间存在一些关键差异。说实话,我在解析这里的标准时遇到了困难,我不明白这些定义之间的区别。
答案 0 :(得分:10)
引用the ISO/IEC 14882:1998 standard document(已从ISO撤回):
默认初始化
T
类型的对象意味着:
- 如果T是非POD类类型(第9节),则调用
T
的默认构造函数(如果T
没有,则初始化不正确 access default constructor);- 如果T是数组类型,则每个元素都是默认初始化的;
- 否则,对象的存储空间为零。
在第7段:
一个对象,其初始化程序是一组空的括号,即
()
,应默认初始化。
有关变更背后的基本原理的详细信息可以在the defect report中找到:
此定义适用于局部变量,但不适用于 由于执行表达式而初始化的对象 形式
T()
,因为这些表达式产生的对象会 立即复制,因此应具有值 保证可以复制。
为此,我建议加入 按照8.5的新案文,第5段:value-initialize
T
类型的对象意味着:
- 如果T是具有用户声明的构造函数(12.1)的类类型(子句9 [class]),则调用T的默认构造函数(和 如果T没有可访问的默认值,则初始化是错误的 构造函数);
- 如果T是没有用户声明的构造函数的类类型,那么T的每个非静态数据成员和基类组件都是 值初始化;
- 如果T是数组类型,则每个元素都是值初始化的;
- 否则,对象的存储空间为零。
此外,我建议将''default-initialization''更改为 5.2.3第2段中的“价值初始化”。
然后,这是一个历史性的解释:
古代历史
曾几何时,一位名叫Laura Eaves的AT& T编译器开发人员问道 我:''
之后,它应该与int()
的价值应该是什么?''我的第一个想法就是这样 在说出x
具有相同的值int x;
但我很快就意识到这个定义是行不通的。原因是 x具有不确定的值(假设它是本地的 变量),但我们不介意
x
是不确定的,因为我们是 可能会在我们使用它之前为x
分配一个值。相反,int()
最好没有不确定的价值,因为复制 这样的值具有不确定的效果。禁止a是愚蠢的 编译期间标记int()
的编译器,只允许它 在执行期间标记它! [...]