std :: sort
меняет местами элементы с помощью std :: swap
, который, в свою очередь, использует конструктор копирования и операторы присваивания, гарантируя получение правильной семантики при обмене значения.
qsort
меняет местами элементы, просто меняя местами базовые биты элементов, игнорируя любую семантику, связанную с типами, которые вы меняете местами.
Даже несмотря на то, что qsort
игнорирует семантику сортируемых типов, он по-прежнему замечательно работает с нетривиальными типами. Если я не ошибаюсь, он будет работать со всеми стандартными контейнерами, несмотря на то, что они не являются типами POD.
Я полагаю, что предварительным условием для qsort
, работающего с типом T
, является то, что T
/ тривиально подвижен /. Вне всяких сомнений, единственные типы, которые нельзя тривиально перемещать, - это те, которые имеют внутренние указатели. Например:
struct NotTriviallyMovable
{
NotTriviallyMovable() : m_someElement(&m_array[5]) {}
int m_array[10];
int* m_someElement;
};
Если вы отсортировали массив из NotTriviallyMovable
, тогда m_someElement
s будут указывать не на те элементы.
Мой вопрос: какие еще типы типов не работают с qsort
?