c++ std::vector将平凡类型归零

icomxhvb  于 2022-12-24  发布在  其他
关注(0)|答案(2)|浏览(187)

chrono的作者声称here如果你有一个chrono::seconds的向量,它在默认情况下不会初始化。我想知道这是如何准确的,例如,如果我初始化一个结构体的向量,它 Package 了一个int,例如Assert永远不会触发下面。这是与零初始化页面分配有关还是标准保证了这一点?

#include <vector>
#include <cassert>

struct X {
    int y;
};

int main() { 
    std::vector<X> vec(10);
    for (auto &el : vec) { 
        assert(el.y == 0);
    }
}
1tuwyuhd

1tuwyuhd1#

例如,如果您阅读this std::vector constructor reference,则定义

std::vector<X> vec(10);

是引用列表中的第4号(从C++11开始),它使用default insertion作为元素。
默认插入执行(* 默认 *)value initialization,而对于类似于您的结构的 * 聚合 *,它执行aggregate initialization,这反过来又会使您成为int成员
从空初始值设定项列表复制初始化
会把它设为零。
有许多步骤要执行,但最终都以将所有y成员初始化为零的良好定义的行为结束。

yebdmbv4

yebdmbv42#

看起来他指的是 array 而不是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

相关问题