【问题标题】:initializer lists in C and C++C 和 C++ 中的初始值设定项列表
【发布时间】:2012-08-28 16:59:49
【问题描述】:

出于某种原因,我认为 C 和 C++ 是这样工作的:

int foo[10] = {57};
for (int i=0; i<10; ++i)
    assert (foo[i] == 57);

原来剩余的整数被初始化为 0,而不是 57。我从哪里得到这个想法?这是真的吗?结构初始化列表是否曾经如此?当分配给 = {} 和 = {0} 时,数组和结构何时开始整齐且正确地初始化为 0 值?我一直认为除非另有明确说明,否则它们会初始化为垃圾。

【问题讨论】:

  • 如果您不指定任何初始化,它们将被初始化为垃圾(未初始化)。即int foo[10];
  • 旁白:如果您希望他们全部为 57,您可以(在 C++ 中):int foo[10]; std::fill(begin(foo), end(foo), 57);
  • How to initialize an array in C 的可能重复项
  • 我没有 K&R 1ed 的副本,但是在 K&R 2ed 中,解释了对剩余元素进行零初始化的行为。
  • @JamesMcNellis 我认为剩余的值根本没有在 K&R1 中初始化。 (但我不会发誓——记忆是一件很棘手的事情,而且已经很长时间了)。

标签: c++ c initializer-list


【解决方案1】:

只要初始化器存在,它就一直如此。 C89 说:

如果列表中的初始值设定项少于一个 聚合,聚合的其余部分应初始化 隐含地与具有静态存储持续时间的对象相同。

【讨论】:

  • 我从来不知道静态持续时间原语也将自己初始化为 0。很有意思!谢谢!
【解决方案2】:

我从哪里得到这个想法?

这显然是一个相对常见的误解,因为我最近从许多其他人那里听到了同样的话。也许你是从其他人那里得到这个错误想法的,或者这个想法只是“直觉的”。

{} 初始化至少可以追溯到 C89。我不知道它曾经以不同的方式工作,或者任何编译器曾经以不同的方式工作。

对于初始化聚合类型(如数组)时的初始化列表:

如果列表中的初始化子句少于聚合中的成员,则每个未显式初始化的成员都应从空的初始化器列表中初始化(8.5.4)。 ——聚合 [dcl.init.aggr] 8.5.1p7

在 C++ 术语中,当您使用空初始值设定项时,对象是值初始化的。

值初始化一个 T 类型的对象意味着:

——如果 T 是一个(可能是 cv 限定的)类类型(第 9 条),带有一个 用户提供的构造函数(12.1),然后是 T 的默认构造函数 被调用(如果 T 不可访问,则初始化格式错误 默认构造函数);

——如果 T 是一个(可能是 cv 限定的)非联合类类型,没有 用户提供的构造函数,则对象为零初始化,如果 T 隐式声明的默认构造函数是不平凡的,即 构造函数被调用。

——如果T是一个数组类型,那么每个元素都是值初始化的;

——否则,对象被零初始化。

                                                                                                        —初始化程序 [dcl.init] 8.5p7

【讨论】:

  • 是的,我最近了解到有关模板的这一事实。不知道还有其他情况。谢谢!
猜你喜欢
  • 2016-01-22
  • 2012-12-24
  • 2013-06-12
  • 2020-01-13
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2019-04-16
  • 2020-02-23
相关资源
最近更新 更多