Нет, он не вызывает конструктор элемента по умолчанию.std::vector
никогда не вызывает конструкторы по умолчанию внутри (это происходит в C ++ 11, но не в более ранних версиях спецификации).
Полная подпись для vector::resize
выглядит следующим образом
void resize(size_type sz, T c = T());
Т.е. у него есть второй параметр (со значением аргумента по умолчанию).Этот второй параметр затем используется в качестве «исходного» объекта для инициализации новых элементов copy-constructor .
Другими словами, ваш вызов resize
фактически эквивалентен
vec.resize( 9, _Struct() );
, что означает, что именно вы вызвали конструктор по умолчанию, когда вы его указали "source "object vector::resize
, даже если вы этого не заметили.
Но каждый элемент типа _Struct не инициализируется, особенно элемент данных, который является другим std :: vector.
А?"Не инициализировано"?Я не знаю, что это должно означать, учитывая, что в вашем примере кода каждый новый элемент, созданный resize
, отлично инициализируется, как описано выше: он инициализируется копией из элемента _Struct()
, который вы неявно предоставили resize
как второй аргумент.Каждый _Struct::fval
и _Struct::ival
равен нулю, а каждый _Struct::data
является пустым вектором.
(В исходном C ++ 98 _Struct::fval
и _Struct::ival
останутся неинициализированными, поскольку до TC1C ++ 98 не поддерживает значение-инициализацию . Но _Struct::data
будет инициализироваться пустым вектором даже в оригинальном C ++ 98).
Я быкак это должно быть инициализировано пустым std :: vector.
Каждый вектор _Struct::data
уже инициализирован как пустой вектор.Что заставило вас поверить, что это не так?
PS Имена, начинающиеся с _
, за которыми следует заглавная буква, зарезервированы реализацией.Вам не разрешено их использовать.