¿Cuál es el mayor defecto (error) que has encontrado?

Me topé con un error de ocho años reportado anteriormente que afectaba el orden de clasificación de cadenas en “la mayoría, si no todas”, las implementaciones de C ++ donde se firmaba char. char está firmado en x86 Linux y Microsoft Visual Studio que cubre mucho terreno.

Tengo un producto de respaldo en la nube que sincroniza los árboles de directorios. Almaceno el estado del objeto del sistema de archivos en un trie con hijos a los que hace referencia un mapa STL indexado por nombre de ruta relativo con el orden de clasificación determinado por sd :: less wrapping std :: char_traits’s compara la función con char o wchar como un parámetro de plantilla dependiendo de la plataforma. También los hago referencia en colas de prioridad con mis directorios de pedido de objetos de comparación después de sus descendientes, pero de lo contrario, uso el pedido léxico normal. Mi detector de punto muerto estaba terminando las sincronizaciones donde la causa raíz era el desacuerdo entre las dos órdenes de clasificación, lo que debería ser imposible.

Supuse que era mi culpa, aunque leer el estándar reveló que estaba siguiendo correctamente su especificación de char_traits de modo que

X :: compare (p, q, n) int rinde: 0 si para cada i en [0, n), X :: eq (p [i], q [i]) es verdadero; de lo contrario, un valor negativo si, para algunos j en [0, n), X :: lt (p [j], q [j]) es verdadero y para cada i en [0, j) X :: eq (p [i], q [i]) es verdadero; De lo contrario, un valor positivo.

dónde

X :: eq (c, d) rendimientos de bool: si c debe tratarse como igual a d.
X :: lt (c, d) rendimientos de bool: si c debe tratarse como menor que d.

y para tipo char

Los miembros de dos argumentos asignan, eq y lt se definen de manera idéntica a los operadores integrados =, == y <respectivamente

Desafortunadamente, no estaba obteniendo ese comportamiento en las rutas con el bit alto establecido en al menos un personaje.

Para citar el informe de defectos de biblioteca estándar de C ++ 467

La mayoría, si no todas, las implementaciones de char_traits :: compare () llaman a memcmp () por eficiencia. Sin embargo, el estándar C requiere memcmp () y strcmp () para interpretar los caracteres en comparación como sin signo, independientemente de la firma de char. Como resultado, todas estas implementaciones de char_traits no cumplen con el requisito impuesto por la Tabla 37 en compare () cuando se firma char.

C ++ 11 corrige esto con un cambio estándar tal que char_traits funciona como char_traits haciendo que sea coherente con compare (pero no <),