Los compiladores de C y C ++ generarán una advertencia cuando compare tipos firmados y no firmados; en su código de ejemplo, no podría hacer que su variable de bucle no esté firmada y que el compilador genere código sin advertencias (suponiendo que dichas advertencias estén activadas).
Naturalmente, está compilando con advertencias al máximo, ¿verdad?
Y, ¿ha considerado compilar con "tratar las advertencias como errores" para ir un paso más allá?
La desventaja de usar números con signo es que existe la tentación de sobrecargarlos para que, por ejemplo, los valores 0-> n sean la selección del menú, y -1 significa que no hay nada seleccionado, en lugar de crear una clase que tenga dos variables, una para indicar si algo está seleccionado y otro para almacenar cuál es esa selección. Antes de que te des cuenta, estás probando uno negativo por todas partes y el compilador se queja de cómo quieres comparar la selección del menú con la cantidad de selecciones de menú que tienes, pero eso es peligroso porque son de diferentes tipos. . Así que no hagas eso.