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(和b和c)将是什么?
我开始查看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/我想a,b和c,会0,我是正确的?
是的,你是对的。您没有使用专门的(定制)分配器。最后,elememts 初始化了值。从DefaultInsertable:
默认情况下,这将调用by的新放置
::new((void*)p) T()(即,对所指向的对象进行值初始化p)。
作为值初始化的结果,的所有成员T将被零初始化。
(强调我的)
如果T是具有默认构造函数的类类型,该构造函数既不是用户提供的也不是用户删除的(也就是说,它可能是带有隐式定义或默认默认构造函数的类),则该对象将被初始化为零,然后默认为-如果它具有非平凡的默认构造函数,则初始化;