я не понимаю, что можно передать в качестве выходного итератора. Кажется, что я не могу просто скастить выходной буфер char'ов к T*, потому что массива T там никогда не существовало. То есть согласно моим представлениям этот код некорректен:
template <class T>
void foo() {
static_assert(alignof(T) < std::max_align);
static_assert(BUF_SIZE % sizeof(T) == 0);
char buf[BUF_SIZE];
std::uninitialized_default_construct(
(T*)buf,
(T*)(buf + BUF_SIZE)
);
}
И даже 20 стандарт здесь не помогает, потому если массив T был создан неявно, мы начнем создавать поверх него новые объекты. В прочем сейчас меня интересует только 17 стандарт.
Где косяк в моем понимании модели памяти плюсов?
кастовать можно
Алгоритм использует адресную арифметику, а там возникает проблема с инкрементом. https://eel.is/c++draft/uninitialized.construct.default#1
В 17 нельзя, но всем пофиг, кажется... Одна из тёмных сторон реализации вектора
Обсуждают сегодня