Я пытаюсь понять, как правильно писать контейнеры 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
);
}
}