Polymorphi c Распределители с отслеживанием состояния, что означает, что они не могут быть сконструированы по умолчанию - потому что они не будут знать о ресурсе памяти, с которым должны работать.
Это не относится к PMR или уникальные указатели, это также может возникнуть, например, при использовании распределителей Boost Interprocess на vector
- вам всегда нужно будет передавать инициализатор для распределителя.
Iff, если вам нужен глобальный / одноэлементный ресурс памяти, вы очевидно, можно объявить настраиваемый удалитель, который кодирует эту константу:
template <typename T> struct pmr_deleter : boost::alloc_deleter<T, Pma> {
pmr_deleter()
: boost::alloc_deleter<T, Pma>(std::pmr::new_delete_resource()) {}
};
Это позволит конструктору (ам) по умолчанию работать:
pmr_unique_ptr<Vertex> v_empty; // FINE
pmr_unique_ptr<Vertex> v_empty(nullptr); // ALSO FINE
Однако это происходит за счет того, что больше не будучи совместимым с типом allocate_unique
, возвращаемым фабрикой (alloc_deleter
).
Вы можете , вероятно, проложите это, но я думаю, что, вероятно, будет лучше понять ситуация, прежде чем вы решите, стоит ли оно того. ( Подсказка: я не думаю, что это так, потому что цель PMR состоит в том, чтобы ввести стирание разницы в распределителе, вместо этого торгуя в состоянии выполнения. Если вы go и снова переместите все состояние в распределитель, вы фактически снова превратил его в распределитель stati c, который в любом случае был бы там, где мы были бы без PMR )
Другие примечания
pmr_deleter<Vertex> d(nullptr);
Неправильно сформирован, поскольку аргумент никогда не может быть нулевым. Оба компилятора предупредят об этом в -Wnon-null
, так же как Asan / UBSan:
/home/sehe/Projects/stackoverflow/test.cpp:18:34: runtime error: null pointer passed as argument 2, which is declared to never be null