【发布时间】:2017-12-20 01:05:06
【问题描述】:
我想将数组的所有成员初始化为零,或者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]{};
}
我知道当将至少一个成员初始化为任何值时,所有其他成员都初始化为零,所以如果我这样做:
int list[4] = { 6 };
第一个成员变成6,其余的都是零初始化的。但是我很困惑:
int list[4]{0};
和
int list[4]{};
我假设声明后没有等号的空波浪括号是所谓的零初始化,而不是默认初始化,但int list[4]{0} 也是如此,不是吗?这是否涉及幕后std::initializer_list?我以为这些只用于非 POD 类型,所以这里没有使用 std::initializer_list?
【问题讨论】:
-
都是aggregate initialization的不同形式,最终效果相同。
-
我喜欢this site 它几乎解释了initializers 的一切。
-
@lakeweb 谢谢。天啊,C++03 和 C++11 是不一样的,这些都是很微妙的东西。
-
@Zebrafish 与您的问题相关的唯一区别是
T list[4]{args, ...};即您在列表 4、5、6 中使用的括号初始化列表语法是在 C++11 中引入的。跨度> -
@user2079303 有趣的大括号初始化列表语法,但不是初始化列表。这里有一些非常细微的差异。在等号之后,它们是聚合初始化或赋值,没有等号,它们的花括号初始化列表语法从 C++11 开始,但对于非 POD 类型,同样的事情会将括号中的内容转换为 std ::initializer_list,我想。
标签: c++ c++11 initialization array-initialization