编译器生成的默认构造函数是否将std :: array中的指针初始化为nullptr?

Mar*_*n F 1 c++ arrays initialization std

给定下面的代码是否正确,编译器应生成Node()哪个应调用std::array<Node *, 100>()哪个应初始化所有指向nullptr的100指针。

旁注:我知道如果使用std::array<Node *, 100> children {};,我可以做到这一点,但我并不是想让我的代码正常工作(它已经做到了),而是试图确保它不是偶然地工作。

struct Node
{
    int value;
    std::array<Node *, 100> children;
}
Run Code Online (Sandbox Code Playgroud)

更新:

这里的指针是垃圾:

struct Node
{
    int value;
    std::array<Node *, 100> children;
}

struct Node
{
    Node() : children() {}
    int value;
    std::array<Node *, 100> children;
}
Run Code Online (Sandbox Code Playgroud)

这里的指针是nullptr:

struct Node
{
    int value;
    std::array<Node *, 100> children {};
}

struct Node
{
    Node() : children{} {}
    int value;
    std::array<Node *, 100> children;
}
Run Code Online (Sandbox Code Playgroud)

请改正我,如果我错了。

Tim*_*imo 5

引用cppreference的构造函数std::array

按照聚合初始化规则初始化数组(请注意,默认初始化可能会导致非类T的值不确定)

通过像声明变量一样std::array<Node *, 100> children;调用默认构造函数。而且,根据初始化,豆荚规则(intchardouble,指针,...)没有默认初始化。因此,不,nullptr如果不使用聚合初始化,则不会使用初始化数组。

汇总初始化

std::array<Node *, 100> children;
Run Code Online (Sandbox Code Playgroud)

调用默认构造函数,但未提供聚合初始化器,因此不会发生聚合初始化。然而

std::array<Node *, 100> children{}
std::array<Node *, 100> children = {};
Run Code Online (Sandbox Code Playgroud)

不仅调用默认构造函数,还执行聚合初始化。在这种情况下,聚合{}只是空的。并且,按照聚合初始化的规则,如果初始化程序少于数据成员,则每个未初始化的成员将被默认初始化。所以

Node x;
std::array<Node *, 100> children = {&x};
Run Code Online (Sandbox Code Playgroud)

例如,将使用指向的指针初始化第一个数组元素,x而每个后续元素将默认初始化为nullptr