首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >测试t=Test();在C++98中发生了什么?

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

Stack Overflow用户
提问于 2016-01-18 14:21:01
回答 1查看 142关注 0票数 0

考虑下列方案:

代码语言:javascript
复制
#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中会发生什么?它是否保证在任何t.a编译器上作为输出(在本例中为C++98的值)获得0?是在C++98中执行默认初始化吗?

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2016-01-18 14:42:54

C++标准(1998年)

dcl.fct.def

7初始化器是一组空括号的对象(即() )应该是默认初始化的。

dcl.init

5到0-初始化T类型对象的存储意味着: -如果T是标量类型(3.9),则将存储设置为转换为T的0(0)值; -如果T是非并类类型,则每个非静态数据成员和每个基类子对象的存储为零初始化; -如果T是一个联合类型,则其第一个数据成员( 89)的存储为零初始化; -如果T是数组类型,则每个元素的存储为零初始化; -如果T是引用类型,则不执行初始化。 要默认-初始化T类型的对象意味着: -如果T是非POD类类型(第9条),则调用T的默认构造函数(如果T没有可访问的默认构造函数,则初始化不正确); -如果T是数组类型,则每个元素都是默认初始化的; -否则,对象的存储为零初始化.

临时值似乎是默认初始化的,这意味着对POD类型( Test是)的初始化为零,因此t.a == 0得到了保证。

由于C++03,这是值初始化,并且仍然保持相同的保证。

在C++03中,值初始化和默认初始化的重新定义似乎是为了不允许零初始化标量和POD类型(在某些情况下)。

票数 3
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/34856965

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档