Для каких типов qsort не работает в C ++?

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 ?

5
задан Peter Alexander 30 May 2011 в 10:11
поделиться