struct A
{
int a;
std::string str;
};
A a;// 1
A a{};// 2
A a = {};// 3
A a = A();// 4
似乎有所有选择。如果1和4 a
未初始化,则2和3中的a
将初始化为零,并且它们都是相同的,只是样式问题还是有所不同? 4应该首先创建一个临时对象,然后将其分配给a
,但是只有当我完全关闭comliler的优化功能时,它才会发生,对吗?
在所有情况下,数据成员str
始终由std::string
的默认构造函数进行默认初始化。由于不同的初始化样式,数据成员a
可能被初始化为0
或不确定的值。详细信息,
第一个是default initialization,因为结果a.a
初始化为不确定值(或者,如果0
是静态或线程局部对象,则将其初始化为a
零),a.str
为由其默认构造函数初始化。
第二个是direct-list-initialization并执行aggregate initialization,结果是a.a
是value-initialized(zero-initialized)至0
,a.str
由其默认构造函数初始化。
第三位是copy-list-initialization并执行汇总初始化,因为结果a.a
被值初始化(零初始化)为0
,a.str
由其默认构造函数初始化。
在概念上,第四个是copy initialization,a
从A()
复制初始化(值初始化的临时A
)。由于copy elision(因为C ++ 17是强制性的),因此a
可能会直接进行值初始化,结果(复制副本不会更改其结果)a.a
被零初始化为0
, a.str
由其默认构造函数初始化。