【发布时间】:2019-08-18 00:46:24
【问题描述】:
#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;
}
v[0].a(以及b 和c)是什么?
我开始看草稿N4659 Working Draft, Standard for Programming
Language C++ 搜索vector::resize:
26.3.11.3 向量容量 [vector.capacity](第 13 条)
void resize(size_type sz);效果:如果
sz < size(),则擦除最后一个size() - sz序列中的元素。否则,追加sz - size()序列中默认插入的元素。
从那里我需要知道 default-inserted 是什么意思,然后我得出结论:
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)使用args和m == get_allocator()在p构造一个元素。 分配器中的默认构造将调用::new((void*)p) T(args), 但专门的分配器可能会选择不同的定义。 — 结束 注意 ]
我还好吗?我的 sn-p 是否使用了专用分配器?我认为最后我的 sn-p 会调用new T(),现在,根据https://stackoverflow.com/a/8280207,我认为a、b 和c 将是0,对吗?
【问题讨论】:
标签: c++ struct language-lawyer standards default-constructor