【问题标题】:Test t=Test(); what happens in C++98?测试 t=Test();在 C++98 中会发生什么?
【发布时间】:2016-01-18 14:21:01
【问题描述】:

考虑以下程序:

#include <iostream>
struct Test
{
    int a;
};
int main()
{
    Test t=Test();
    std::cout<<t.a<<'\n';
}

Test t=Test(); 值初始化一个临时值并复制初始化它。 (大多数编译器优化了复制操作(来源:value initialization))。但是值初始化是由C++03 引入的。当 Test t=Test(); 被执行时,C++98 会发生什么?是否保证我将在任何C++98 编译器上得到 0 作为输出(在这种情况下为t.a 的值)? .是在C++98中进行默认初始化吗?

【问题讨论】:

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


【解决方案1】:

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 类型进行零初始化(在某些情况下)。

【讨论】:

  • 并且值 t.a 从 C++03 开始​​保证为 0。对吗?
  • @PravasiMeet 我检查了默认初始化的定义并重写了答案。看来该保证同时适用于 C++03 前后。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-04-03
  • 1970-01-01
  • 2015-02-01
  • 1970-01-01
相关资源
最近更新 更多