struct的std :: vector:向量调整大小后,该结构的成员的初始值是多少?

Ale*_*son 3 c++ standards struct default-constructor language-lawyer

#include <vector>
#include <iostream>

typedef struct {
   unsigned short a;
   unsigned short b;
   unsigned long  c;
}T;

int main(int,char**)
{
    std::vector<T> v;
    v.resize(256);
    std::cout << "a=" << v[0].a << " b=" << v[0].b << " c=" << v[0].c << "\n";
    return 0;
}
Run Code Online (Sandbox Code Playgroud)

v[0].a(和bc)将是什么?

我开始查看N4659工作草案,《 C ++编程语言标准》,其内容vector::resize如下:

26.3.11.3向量容量[vector.capacity](在第13节中)

void resize(size_type sz);

效果:如果为sz < size(),则删除size() - sz序列中的最后一个 元素。否则,将sz - size() 默认插入的元素追加到序列中。

从那里,我需要知道默认插入的含义,然后得出:

26.2.1集装箱的一般要求[container.requirements.general](第15.2节)

— 如果通过计算表达式初始化的元素,X默认插入

allocator_traits<A>::construct(m, p)

其中p是在中分配的元素的未初始化存储的地址X

现在,我需要知道里面发生了什么construct,我发现了这张纸条

26.2.1集装箱的一般要求[container.requirements.general](在第15条末)

[ 注意:容器调用allocator_traits<A>::construct(m, p, args)p使用args时与一起构造一个元素m == get_allocator()。分配器中的默认构造将调用::new((void*)p) T(args),但是专用分配器可以选择其他定义。— 尾注 ]

我可以吗 我的代码段是否使用专门的分配器?我认为,在结束我的代码段将调用new T()而现在,根据/sf/answers/579614521/我想abc,会0,我是正确的?

son*_*yao 6

是的,你是对的。您没有使用专门的(定制)分配器。最后,elememts 初始化了值。从DefaultInsertable

默认情况下,这将调用by的新放置::new((void*)p) T()(即,对所指向的对象进行值初始化p)。

作为值初始化的结果,的所有成员T将被零初始化。

(强调我的)

如果T是具有默认构造函数的类类型,该构造函数既不是用户提供的也不是用户删除的(也就是说,它可能是带有隐式定义或默认默认构造函数的类),则该对象将被初始化为零,然后默认为-如果它具有非平凡的默认构造函数,则初始化;