chrono的作者在这里声明,如果你有一个chrono::seconds的向量,默认情况下它不会初始化。我想知道这是如何准确的,例如,如果我初始化一个包装int的结构体的向量,例如断言永远不会触发下面。这是否与零初始化页面分配有关,或者标准是否保证这一点?
#include <vector>
#include <cassert>
struct X {
int y;
};
int main() {
std::vector<X> vec(10);
for (auto &el : vec) {
assert(el.y == 0);
}
}
如果你阅读例如这个std::vector
构造函数参考,定义
std::vector<X> vec(10);
是引用列表中的第4号(从c++ 11开始),它使用默认插入元素。
默认插入(通过默认)值初始化对于聚合像你的结构聚合初始化这反过来将使你成为int
成员
从空初始化列表复制初始化
将其设置为0。
有很多步骤要完成,但最终都以将所有y
成员初始化为零的定义良好的行为结束。
看起来他指的是数组而不是vector,因为vector元素总是初始化的。
std::array<second, 100> arr1; // not initialized
std::array<second, 100> arr2{}; // zero initialized
std::unique_ptr<second[]> arr3{ new second[100] }; // not initialized
std::unique_ptr<second[]> arr4{ new second[100]{} }; // zero initialized
std::vector<second> vec(100); // zero initialized