这些在C++中初始化C数组的方法有区别吗?

Zeb*_*ish 6 c++ initialization array-initialization c++11

我想初始化数组的所有成员为零,或 nullptr

struct Window{ int a;};


int main()
{
    Window* list[4] = { 0, 0, 0, 0 };
    Window* list2[4] = {0};
    Window* list3[4] = {};
    Window* list4[4]{ 0, 0, 0, 0 };
    Window* list5[4]{0};
    Window* list6[4]{};
}
Run Code Online (Sandbox Code Playgroud)

据我所知,当将至少一个成员初始化为任何值时,所有其他成员都初始化为零,所以如果我这样做:

int list[4] = { 6 };
Run Code Online (Sandbox Code Playgroud)

第一个成员变为6,所有其余成员都是零初始化.我很困惑:

int list[4]{0};
Run Code Online (Sandbox Code Playgroud)

int list[4]{};
Run Code Online (Sandbox Code Playgroud)

我假设在没有等号的声明之后的空的波浪形括号是所谓的零初始化,而不是默认初始化,但也是如此int list[4]{0},不是吗?这是否涉及std::initializer_list到幕后?我以为这些只用于非POD类型,所以std::initializer_list这里没有使用?

eer*_*ika 3

在 C++ 中初始化 C 数组的这些方法有区别吗?

不,它们在语义上是等效的。

零初始化,与默认初始化相反,但 int list[4]{0} 也是如此,不是吗?

第一个元素被复制初始化为零。其余元素均已进行值初始化,这实际上int是零初始化。在特殊情况下,值、零和带有零的复制初始化没有任何实际差异int。在这种情况下,区别在于语法。

这是否涉及幕后的 std::initializer_list ?

std::initializer_list不参与。