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