Pra*_*tic 12 c++ language-lawyer value-initialization c++03 c++98
干杯和hth.- Alf在这个答案中发表评论说,与C++ 98相比,值初始化可以说是C++ 03的一个新特性.我想知道他的意思.
是值初始化的C++ 98的一部分?它是出现在概念中而不是名义上吗?为什么它被添加到C++ 03标准中?
我有'03标准的副本,但不是'98标准.这是默认初始化和值初始化的定义.
默认初始化T类型的对象意味着:
- 如果T是非POD类类型(第9节),则调用T的默认构造函数(如果T没有可访问的默认构造函数,则初始化是错误的);
- 如果T是数组类型,则每个元素都是默认初始化的;
- 否则,对象被零初始化.
对值类型T的对象进行值初始化意味着:
- 如果T是具有用户声明的构造函数(12.1)的类类型(第9节),则调用T的默认构造函数(如果T没有可访问的默认构造函数,则初始化是错误的);
- 如果T是没有用户声明的构造函数的非联合类类型,则T的每个非静态数据成员和基类组件都是值初始化的;
- 如果T是数组类型,则每个元素都是值初始化的;
- 否则,对象被零初始化
我的猜测是'98有默认初始化但不是值初始化,并且两者之间存在一些关键差异.说实话,我在解析这里的标准时遇到了麻烦,我不明白这些定义之间的区别.
Col*_*mbo 10
引用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段中将''default-initialization''改为''value-initialization''.
然后,一个历史的解释:
古代历史
曾几何时,名为劳拉·伊夫斯的AT&T编译器开发者问我:""应该是什么价值
int()?""我首先想到的是,它应该是相同的值,x说了之后Run Code Online (Sandbox Code Playgroud)int x;但我很快就意识到这个定义是行不通的.原因是x有一个不确定的值(假设它是一个局部变量),但我们不介意这
x是不确定的,因为我们可能会x在使用它之前分配一个值.相反,int()最好没有不确定的值,因为复制这样的值具有不确定的效果.禁止编译器int()在编译期间进行标记是非常愚蠢的,只是允许它在执行期间标记它![...]
| 归档时间: |
|
| 查看次数: |
1549 次 |
| 最近记录: |