Почему std:: sort crash, если функция сравнения не является оператором <?

Следующая программа скомпилирована с VС++ 2012.

#include <algorithm>

struct A
{
    A()
        : a()
    {}

    bool operator <(const A& other) const
    {
        return a <= other.a;
    }

    int a;
};

int main()
{
    A coll[8];
    std::sort(&coll[0], &coll[8]); // Crash!!!
}

Если я изменяю return a <= other.a; на return a < other.a;, то программа работает как ожидалось без исключения.

Почему?

Ответ 1

std::sort требует сортировщика, который удовлетворяет правилу строгого слабого упорядочения, что объясняется здесь

Итак, ваш компартер говорит, что a < b, когда a == b, который не следует правилу строгого слабого упорядочения, возможно, что алгоритм потерпит крах, потому что он войдет в бесконечное цикл.

Ответ 2

Ответ на xorguy довольно хорош.

Я бы просто добавил некоторые цитаты из стандарта:

25.4 Сортировка и связанные операции [alg.sorting]

Для того, чтобы алгоритмы, отличные от описанных в 25.4.3, работать корректно, comp должен вызвать строгий слабый порядок значений.

Термин "строгий" относится к требованию нефлексивного отношения (! comp (x, x) для всех x), а термин слабый к требованиям, которые не так сильны, как требования для полного упорядочения, но более сильные, чем для частичный порядок.

Итак, xorguy объясняет это очень хорошо: функция comp говорит, что a < b, когда a == b, которая не соответствует правилу строгого слабого упорядочения...