Вызывает ли метод vector.resize () конструкторы элементов по умолчанию при изменении размера? - PullRequest
8 голосов
/ 14 сентября 2011

Я пытаюсь следующий код:

struct _Struct2
{
    void   *ptr;
    double dval;
};

struct _Struct
{
    float fval;
    int   ival;
    std::vector<_Struct2>   data;
};

std::vector<_Struct>    vec;


int main()
{
    vec.resize( 9 );
    for ( int i = 0; i < vec.size(); i++ )
    {
        _Struct &elem = vec[i];
        int     len = elem.data.size(); // elem.data is [0]()
    }
}

Resize (9) должен выделить 9 элементов типа _Struct.И на самом деле это работает.Но каждый элемент типа _Struct не инициализируется, особенно элемент данных, который является другим std :: vector.Я хотел бы, чтобы он был инициализирован в пустой std :: vector.Нужно сделать это вручную?Я думал, что метод resize () вызвал бы конструктор по умолчанию для каждого элемента _Struct.Thx

Ps.Названия структур, использованных здесь, - это только первые вещи, которые приходят мне в голову.Это всего лишь пример.Моя Visual Studio сообщает мне, что elem.data в представлении отладки соответствует [0]().

Ps.Забудьте [0]().

1 Ответ

19 голосов
/ 14 сентября 2011

Нет, он не вызывает конструктор элемента по умолчанию.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 Имена, начинающиеся с _, за которыми следует заглавная буква, зарезервированы реализацией.Вам не разрешено их использовать.

...