考虑下列方案:
#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中执行默认初始化吗?
发布于 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类型(在某些情况下)。
https://stackoverflow.com/questions/34856965
复制相似问题