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)
请改正我,如果我错了。
引用cppreference的构造函数std::array:
按照聚合初始化规则初始化数组(请注意,默认初始化可能会导致非类T的值不确定)
通过像声明变量一样std::array<Node *, 100> children;调用默认构造函数。而且,根据初始化,豆荚规则(int,char,double,指针,...)没有默认初始化。因此,不,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。
| 归档时间: |
|
| 查看次数: |
62 次 |
| 最近记录: |