测试t = Test();在C ++ 98中会发生什么?

时间:2016-01-18 14:21:01

标签: c++ object initialization c++03 c++98

考虑以下计划:

#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

中执行默认初始化

1 个答案:

答案 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类型(在某些情况下)。