根据 C++ 版本和编译器初始化数组
Initialize array based on C++ version and compiler
在 C++11 或更高版本中,无论编译器如何 int myArray[10] = { 0 };
都会将所有元素初始化为零。问题是这是否也适用于 C++98,编译器是否可以不决定将所有元素初始化为零?换句话说,带有给定编译器的 C++98 可以忽略为所有元素分配零吗?
我找到了这个页面:https://en.cppreference.com/w/cpp/language/zero_initialization,其中列出了有关零初始化的 C++98 缺陷。
所有元素都将为零。来自 C++98 的引述:
[dcl.init.aggr]
If there are fewer initializers in the list than there are members in the aggregate, then each member not
explicitly initialized shall be default-initialized (8.5)
[dcl.init]
To default-initialize an object of type T means:
- if T is a non-POD class type (clause 9), the default constructor for T is called (and the initialization is
ill-formed if T has no accessible default constructor);
- if T is an array type, each element is default-initialized;
- otherwise, the storage for the object is zero-initialized.
默认初始化的含义在 C++98 中与其从 C++03 开始的含义完全不同,在 C++03 中,旧的默认初始化本质上被重命名为值初始化,而新的默认初始化变成了“无初始化”的意思对于普通类型。
请注意,int myArray[10] = {};
将实现相同的目标。没有必要为第一个元素显式提供值。
在 C++11 或更高版本中,无论编译器如何 int myArray[10] = { 0 };
都会将所有元素初始化为零。问题是这是否也适用于 C++98,编译器是否可以不决定将所有元素初始化为零?换句话说,带有给定编译器的 C++98 可以忽略为所有元素分配零吗?
我找到了这个页面:https://en.cppreference.com/w/cpp/language/zero_initialization,其中列出了有关零初始化的 C++98 缺陷。
所有元素都将为零。来自 C++98 的引述:
[dcl.init.aggr]
If there are fewer initializers in the list than there are members in the aggregate, then each member not explicitly initialized shall be default-initialized (8.5)
[dcl.init]
To default-initialize an object of type T means:
- if T is a non-POD class type (clause 9), the default constructor for T is called (and the initialization is ill-formed if T has no accessible default constructor);
- if T is an array type, each element is default-initialized;
- otherwise, the storage for the object is zero-initialized.
默认初始化的含义在 C++98 中与其从 C++03 开始的含义完全不同,在 C++03 中,旧的默认初始化本质上被重命名为值初始化,而新的默认初始化变成了“无初始化”的意思对于普通类型。
请注意,int myArray[10] = {};
将实现相同的目标。没有必要为第一个元素显式提供值。