Инициализация по умолчанию в constexpr с помощью std :: allocator - PullRequest
1 голос
/ 21 июня 2020

Сначала я реализовал псевдоконтейнер с поддержкой constexpr, используя голый new / delete. Затем я переделал его, чтобы использовать std::allocator при всей его полезности. Делая это, я обнаружил, что нет возможности реализовать constexpr uninitialized_default_construct, потому что вы не можете использовать размещение new в constexpr, а также нет ничего в C ++ 20 с эквивалентными эффектами, которые также constexpr.

Есть ли способ обойти это без серьезных изменений в реализациях контейнеров для поддержки инициализации по умолчанию в constexpr? Помимо написания статьи, чтобы сделать uninitialized_default_construct constexpr или представить что-то вроде default_construct_at, похожее на construct_at?

1 Ответ

0 голосов
/ 21 июня 2020

Используйте голый new, если вы хотите инициализацию по умолчанию в constexpr и ваш контейнер имеет фиксированный размер. Это означает использование delete[] вместо std::allocator.deallocate, за которым следует std::destroy. Вы по-прежнему можете разделить выделение и создание, но будьте осторожны, чтобы инициализировать все элементы до завершения построения, чтобы избежать попытки delete[] уничтожить объект в неинициализированной памяти.

Для контейнеров нефиксированного размера поддерживается std будет необходимо, как указано в вопросе.

...