Например, из std :: deque :: operator = в C ++ Справочник:
(1) Копировать назначение (const std :: deque & other) < / strong>
Заменяет содержимое копией содержимого другого.
Если std :: allocator_traits ::ropate_on_container_copy_assignment () истинно, целевой распределитель заменяется копией исходного распределителя. Если целевой и исходный распределители не сравниваются одинаково, целевой (* this) распределитель используется для освобождения памяти, тогда другой распределитель используется для выделения ее перед копированием элементов.
Если this->get_allocator() == other.get_allocator()
, я могу просто уничтожить и освободить this
'элементы, если необходимо, или выделить и построить элементы, если необходимо, или скопировать-присвоить элементы из other
в *this
, если необходимо.
А если нет? Означает ли приведенная выше цитата, что я не могу копировать и назначать элементы, поэтому мне нужно сначала уничтожить и освободить ВСЕ элементы, используя this->get_allocator()
, а затем выделить и построить элементы, используя other.get_allocator()
?
Но если это случае, почему я должен использовать other.get_allocator()
для распределения?
Разве это не вызовет позже ошибку времени выполнения, поскольку this
не освободит память должным образом?
(2) Переместить назначение (std :: deque && other)
Заменяет содержимое другим содержимым, используя семантику перемещения (т. Е. Данные в другом перемещаются из другого в этот контейнер). other после этого находится в допустимом, но неуказанном состоянии. Если std :: allocator_traits ::ropate_on_container_move_assignment () истинно, целевой распределитель заменяется копией исходного распределителя. Если оно ложно и исходный и целевой распределители не сравниваются равными, цель не может стать владельцем исходной памяти и должна перемещать-назначать каждый элемент индивидуально, выделяя дополнительную память, используя свой собственный распределитель по мере необходимости. В любом случае, все элементы, изначально присутствующие в * this, либо уничтожаются, либо заменяются поэлементным перемещением-присваиванием.
Если this->get_allocator() == other.get_allocator()
, это простая задача.
Но если нет, следуют те же вопросы, приведенные выше, за исключением этого случая, когда используется назначение перемещения.
В обоих случаях у меня есть дополнительный вопрос.
Если элементы нельзя ни копировать, ни перемещать, можно ли уничтожить их и построить из других? Если да, то чей распределитель я должен использовать?