Я пытаюсь понять, как правильно писать контейнеры AllocatorAware.
Мое понимание состоит в том, что propagate_on_container_move_assignment
typedef указывает, нужно ли копировать определенный тип Allocator
, когда сам контейнер перемещается.
Итак, поскольку я не могу найти никаких примеров этого, мой собственный удар в нем будет примерно следующим:
Учитывая тип контейнера Container
, тип Allocator
allocator_type
и внутренний элемент данных allocator_type
m_alloc
:
Container& operator = (Container&& other)
{
if (std::allocator_traits<allocator_type>::propagate_on_container_move_assignment::value)
{
m_alloc = std::allocator_traits<allocator_type>::select_on_container_copy_construction(
other.m_alloc
);
}
return *this;
}
Правильно ли это?
Кроме того, еще один источник путаницы заключается в том, что вложенные typedefs propagate_on_container_move/copy_assignment
конкретно говорят о назначении... но что относительно конструкторов? Нужно ли проверять эти typedefs конструктор перемещения или конструктор копирования контейнера AllocatorAware
? Я думаю, что ответ будет да здесь..., то есть мне также нужно будет написать:
Container(Container&& other)
{
if (std::allocator_traits<allocator_type>::propagate_on_container_move_assignment::value)
{
m_alloc = std::allocator_traits<allocator_type>::select_on_container_copy_construction(
other.m_alloc
);
}
}