Например, из стандов :: Deque :: оператора = в C++ Reference:
(1) Копия Назначение(Const станда :: Deque & друг)
Как реализовано назначение контейнера с поддержкой распределителя?
Заменяет содержимое с копией содержимого другого.
Если std :: allocator_traits :: propagate_on_container_copy_assignment() is true, целевой распределитель заменяется копией источника распределителя. Если целевые и исходные распределители не сравнивают равным, целевой (* этот) распределитель используется для освобождения памяти, , тогда другой распределитель используется для распределения его перед копированием элементов .
Если this->get_allocator() == other.get_allocator()
, я могу просто уничтожить и освободить this
'элементы, если это необходимо, или выделить и построить элементы, если это необходимо, или копирования назначить элементы из other
в *this
при необходимости.
А что, если нет? Является ли цитата выше, что я не могу копировать-присваивать элементы, поэтому мне нужно сначала уничтожить и удалить все элементы, используя this->get_allocator()
, а затем выделить и построить элементы, используя other.get_allocator()
?
Но если это так, почему я должен использовать other.get_allocator()
для распределения?
Не приведет ли это к некоторой ошибке во время выполнения, так как this
не освободит память должным образом?
(2) Переместить Назначение(станд :: Deque & & других)
Заменяет содержимое с другой использованием семантики хода (то есть данные в другом перемещаются из другога в этот контейнер). другой после этого находится в правильном, но неуказанном состоянии. Если std :: allocator_traits :: propagate_on_container_move_assignment() is true, целевой распределитель заменяется копией источника распределителя. Если он неверен, а источник и целевые распределители не сравниваются с равными, цель не может владеть исходной памятью и должна перемещать каждый элемент отдельно, выделяя дополнительную память с использованием собственного распределителя по мере необходимости. В любом случае, весь элемент , изначально присутствующий в *, либо уничтожен, либо заменен путем элементарного присвоения перемещения.
Если this->get_allocator() == other.get_allocator()
, это непростая задача.
Но если нет, следуют те же вопросы, за исключением случаев, когда используется переадресация.
В обоих случаях у меня есть дополнительный вопрос.
Если элементы не могут быть назначены или назначены по назначению, можно ли его уничтожить и построить из другого? Если это так, какой распределитель я должен использовать?
Что о не-POCCA распределители? Должен ли я использовать 'this-> get_allocator()' в любое время? –
Ну, да, если вам нужно выделить. –