на массив типа T.
i - некая итерация в цикле.
new(arr + i) T(arr[i]);
Я правильно понимаю, что здесь вызывается конструктор для массива объектов Т? Или...?
Буду благодарен, если объясните
вызывается конструктор без выделения памяти
Но общий смысл подобного довольно туманен. По факту это копирование объекта в себя и я не могу представить себе случая, когда это было бы необходимо.
Вам передали буффер для кодирования в него какой нибудь информации. А вы таким не тривиальным образом sec_num/ещё какие нибудь данные заполняете.
Так заполнение либо уже произошло, либо в рамках такой операции (при условии сохранения ее конвенционной семантики) не произойдет.
Вам надо инициализировать какие то данные в структуре. Собственно вы на уже выделенной памяти вызываете копирующий конструктор. А он, выполняет какие то действия, которые удобнее выполнить в нём самом. Я чаще встречал конечно просто дефолтный placement new. Для того что бы на памяти, выделенной снаружи как блоб, инициализировать структуру.
И эти данные либо уже инициализированы, либо останутся неинициализированными (в лучшем случае) в результате подобной операции. "Type-punning" такой, увы, обречен (а с двадцатого стандарта еще и избыточен скорее всего). Edit: Уточню, пожалуй, что его здесь и нет, разве что предполагается.
Они могут быть не инициализированы. Там указатель i*. std::vector<char> buffer (n*sizeof(T), 0); auto i* = reinterpred_cast<T*>(buffer.data()); auto* t = new(i)T();
Оберните код в теги: 3 символа ` до и после кода (в случае одиночной конструкции достаточно 1 ` с обеих сторон). Спасибо!
Обсуждают сегодня