std::vector将不重要的类型归零



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

最新更新