扩展的初始化程序列表和未初始化的成员

时间:2018-09-28 20:35:15

标签: c++

在过去的结构中,

typedef struct A {
    int m_i;
    int m_j;
} A;

在堆上分配或在函数中本地声明而不被memset对其成员进行初始化。

但是,令我惊讶的是,这个小程序显示它始终设置为0。

#include <stdio.h>

typedef struct A {
    int m_i;
    int m_j;
} A;

void f(const A& a) {
    printf("i=%i, j=%i\n", a.m_i, a.m_j);
}

void y() {
    f({10});
}

int main() {
    y();
    return 0;
}

使用g++ -std=c++11 a.cpp

构建

我只是以防万一定义了一个构造函数以确保它们为零,但是我的各种测试表明(使用在Internet上找到的代码)我不必这样做。

这是剪切巧合还是扩展的初始值设定项列表可以保证内存是内存集?

1 个答案:

答案 0 :(得分:4)

typedef struct A {
    int m_i;
    int m_j;
} A;

是一个聚合。当您使用 braced-init-list 初始化聚合时,它将使用列表中的每个元素来初始化聚合的每个成员。如果您在 braced-init-list 中没有提供足够的元素,则可以保证每个后续成员都将被值初始化,这对于基本类型意味着它们被初始化为零。