Comportamiento definido por la implementación y comportamiento indefinido
El estándar C ++ es muy específico sobre los efectos de varias construcciones y, en particular, siempre debe estar atento a estas categorías de problemas :
El comportamiento indefinido significa que no hay absolutamente ninguna garantía. El código podría funcionar, o podría incendiar su disco duro o hacer que los demonios salgan volando por su nariz . En lo que respecta al lenguaje C ++, puede pasar absolutamente cualquier cosa. En términos prácticos, esto generalmente significa que tiene un error irrecuperable. Si esto sucede, realmente no puede confiar en nada acerca de su aplicación (porque uno de los efectos de este comportamiento indefinido podría haber sido arruinar la memoria utilizada por el resto de su aplicación). No es necesario que sea coherente, por lo que ejecutar el programa dos veces puede dar resultados diferentes. Puede depender de las fases de la luna, el color de la camisa que llevas puesta o absolutamente cualquier otra cosa.
El comportamiento no especificado significa que el programa debe hacer algo sensato y coherente, pero no es necesario que lo documente .
El comportamiento definido por la implementación es similar al no especificado, pero los redactores del compilador también deben documentarlo. Un ejemplo de esto es el resultado de a reinterpret_cast
. por lo general , simplemente cambia el tipo de puntero, sin modificar la dirección, pero el mapeo está realmente definido por la implementación, por lo que un compilador podría mapear a una dirección completamente diferente, siempre que documente esta elección. Otro ejemplo es el tamaño de un int. Al estándar C ++ no le importa si tiene 2, 4 u 8 bytes, pero debe estar documentado por el compilador
Pero lo común de todos estos es que es mejor evitarlos. Cuando sea posible, siga el comportamiento 100% especificado por el estándar C ++. De esa manera, tiene la portabilidad garantizada.
A menudo, también debe confiar en algún comportamiento definido por la implementación. Puede ser inevitable, pero aun así debe prestarle atención y ser consciente de que depende de algo que puede cambiar entre diferentes compiladores.
El comportamiento indefinido, por otro lado, siempre debe evitarse. En general, debe asumir que hace que su programa explote de una forma u otra.