在c ++中支持{}和{0}之间的初始化差异

Laz*_*gre 0 c++ compilation c++11

几年前我读到使用{}和{0}来初始化POD在c ++中有一些细微的差别,其中一个可以在你的代码中引入悲观化.

D3D11_TEXTURE2D_DESC dsd = {};
D3D11_TEXTURE2D_DESC dsd2 = { 0 }:
Run Code Online (Sandbox Code Playgroud)

虽然我知道{0}肯定是从c继承而且{}是在c ++ 11中引入的东西,但两者都应该在编译期间被翻译成同一个memset()调用:

memset(&dsd, 0, sizeof(dsd));
Run Code Online (Sandbox Code Playgroud)

然而,2个大括号初始化样式中的一个做了内存初始化未对齐的事情,是否有人关心哪个样式更好以及为什么?

eer*_*ika 6

您引用的语法称为聚合初始化.

如果初始化程序子句的数量小于成员数或初始化程序列表完全为空,则其余成员将进行值初始化

由于POD的值初始化与零初始化相同,因此您显示的两种语法之间没有区别.

甚至在C++ 11之前就是这种情况 - 空的初始化列表不是它引入的东西.从C++ 11开始,非POD也允许使用语法.聚合初始化现在是此新列表初始化的特例.

  • @Nikos “{0}”中的“0”是第一个成员的初始化程序。`{0, 0}` 将初始化两个成员。`{1}` 会将第一个成员初始化为 1。其余没有初始化程序的成员将进行值初始化。对于基本类型来说,这是零初始化。`{}` 没有任何成员的初始化器,因此所有成员都被值初始化(在基本类型的情况下为零初始化)。 (3认同)