Я знаю, что очередь приоритетов STL использует make_heap
, push_heap
, а также pop_heap
управлять базовым контейнером stl (вектором, например).
Вызываются ли конструкторы копирования элементов при перемещении элементов во время make_heap
, push_heap
, а также pop_heap
звонки?
Согласно стандарту, push_heap
а также make_heap
требуется тип значения (*iterator
) быть MoveAssignable
а также MoveConstructible
; pop_heap
а также sort_heap
также требуют, чтобы тип итератора был ValueSwappable
, что требует swap
работать, что также требует, чтобы тип значения был MoveAssignable
а также MoveConstructible
,
Моя интерпретация заключается в том, что стандартная библиотека может вызывать только те операции, которые могут быть удовлетворены семантикой перемещения, что можно проверить, попробовав ее на контейнере, конструктор копирования типа значения и оператор назначения копирования которого были удалены.
В качестве быстрой проверки я попробовал функции кучи для типа данных, конструктор перемещения и оператор назначения перемещения которого были удалены. И gcc 4.7.2, и clang 3.2 генерировали ошибки во время компиляции, жалуясь на то, что операции перемещения были удалены. Тест с удаленными операциями копирования скомпилирован просто отлично.
Я проверил мою реализацию. Он использует только конструкторы перемещения и назначения перемещений. Поскольку базовый тип является типичным вектором или декой, я не вижу, как вы можете добиться большего.
Вы можете проверить себя, создав фиктивный класс с одним int (необходимым для сопоставления объектов) и поместив операторы print в конструктор по умолчанию, конструктор копирования, конструктор перемещения, оператор присваивания копии и оператор присваивания перемещения.
Несмотря на то, что это зависит от реализации, наиболее разумные реализации будут использовать std :: swap для перемещения элементов, что позволяет избежать затрат на копирование.