#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 Рабочий проект, стандарт для программирования
Язык 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()
.
Конструкция по умолчанию в allocator вызовет ::new((void*)p) T(args)
,
но специализированные распределители могут выбрать другое определение. - конец
примечание ]
Я в порядке? Использует ли мой фрагмент специализированные распределители ? Я думаю, что в конце мой фрагмент вызовет new T()
, и теперь, согласно https://stackoverflow.com/a/8280207 Я думаю, a
, b
и c
будут 0
, я прав?