考虑以下计划:
#include <iostream>
struct Test
{
int a;
};
int main()
{
Test t=Test();
std::cout<<t.a<<'\n';
}
Test t=Test();
值初始化临时&amp;复制初始化它。 (大多数编译器优化了复制操作(来源:value initialization))。但C++03
引入了值初始化。执行 C++98
时Test t=Test();
会发生什么?是否保证在任何t.a
编译器中我将得到0作为输出(在这种情况下为C++98
的值)? 。它是否在C++98
?
答案 0 :(得分:3)
C ++标准(1998)
[dcl.fct.def]
7一个对象,其初始化程序是一组空的括号,即(),应默认初始化。
[dcl.init]
5为类型为T的对象零初始化存储意味着:
- 如果T是标量类型(3.9),则将存储设置为0(零)转换为T的值;
- 如果T是非联合类类型,则每个非静态数据成员和每个基类子对象的存储都是零初始化的;
- 如果T是联合类型,则其第一个数据成员89)的存储是零初始化的;
- 如果T是数组类型,则每个元素的存储都是零初始化的;
- 如果T是引用类型,则不执行初始化。
默认初始化T类型的对象意味着:
- 如果T是非POD类类型(第9节),则调用T的默认构造函数(如果T没有可访问的默认构造函数,则初始化是错误的);
- 如果T是数组类型,则每个元素都是默认初始化的;
- 否则,对象的存储空间为零。
临时默认初始化,这意味着POD类型的初始化为零(Test
为},因此保证t.a == 0
。
从C ++ 03开始,这是值初始化,同样保证。
似乎在C ++ 03中添加值初始化和重新定义默认初始化,是为了不允许零初始化标量和POD类型(在某些情况下)。