¿Por qué std :: sort segfault con comparadores no transitivos?

struct Object
{
    int x;
    int y;
    bool isXValid()
    {
       return x > 0;
    }
};

bool mySort(const Object& lhs, const Object& rhs)
{
    // Note the short-circuit here
    bool isValidForCheck = lhs.isXValid() && rhs.isXValid();

    // rhs may be valid because short-circuit, or both may be invalid
    if (isValidForCheck)
    {
       return lhs.x < rhs.x;
    }

    return lhs.y < rhs.y;
}

int main()
{
    std::vector<Object> myVec;
    // random populating of myVec
    std::sort(myVec.begin(), myVec.end(), mySort);
    return 0;
}

Mi función de comparación es irreflexiva pero no respeta la transitividad.

pedido stl - pedido estricto y débil

Por lo tanto, si:

  (a < b) == true, (b < a) must be false.

Además, si:

   a == b, then (a < b) and (b < a) are false.

Sin embargo, no es transitivo. Por ejemplo, con los siguientes valores:

 (1, 3) (-1, 2), (3, 1)

Entonces es posible producir un contenedor ordenado donde:

  a < b, and b < c, but c < a.

Esta respuesta:Qué causa que std :: sort () acceda a la dirección fuera de rango explica por qué std :: sort abordará los límites cuando la función de comparación no respeta la irreflexibilidad (por ejemplo, la ordenación rápida donde hacemos comp (pivot, pivot) y realizamos, por lo que el puntero izquierdo sigue caminando desde el final de la matriz).

Sin embargo, estoy viendo accidentes con comparaciones que son irreflexivas pero no transitivas. También creo que me estoy yendo al final de la matriz.

No puedo proporcionar el código exacto aquí, ya que es propietario. El ejemplo anterior no se bloqueará en mis pruebas, pero soy consciente de que std :: sort seleccionará diferentes algoritmos basados en el contenedor y los elementos que se ordenarán.

Lo que me gustaría saber es si alguien sabe por qué std :: sort se bloquearía bajo GNU C ++ cuando la comparación no es transitiva. Sé que las comparaciones no transitivas rompen el contrato y es un comportamiento indefinido, pero esperaba una respuesta similar a la de la pregunta vinculada, es decir, precisamentepor qué Se puede estrellar.

Respuestas a la pregunta(0)

Su respuesta a la pregunta