c++ language-lawyer

En el estándar de C++, ¿qué se especifica que ocurra cuando se viola un requisito de "debe"?



language-lawyer (2)

Además de la respuesta de @ JerryCoffin, también existen las Directivas ISO / IEC Parte 2 (que rigen todos los documentos ISO / IEC, incluida la Norma C ++), en particular las formas verbales del Anexo H para la expresión de disposiciones

Las formas verbales que se muestran en la Tabla H.1 se utilizarán para indicar los requisitos que deben seguirse estrictamente para ajustarse al documento y de los cuales no se permite ninguna desviación.

deberá :

  • Es para,
  • se requiere para,
  • se requiere que,
  • tiene que,
  • solo se permite,
  • es necesario

no deberá :

  • no está permitido [permitido] [aceptable] [permitido],
  • se requiere que no sea
  • Se requiere que… no sea
  • no es ser

Por lo tanto, una violación de un requisito de "debe" hace que un programa no esté bien formado. Los problemas de diagnóstico han sido respondidos en otros lugares.

Por ejemplo, las palabras famosas (§3.2 / 1)

Ninguna unidad de traducción contendrá más de una definición de cualquier variable, función, tipo de clase, tipo de enumeración o plantilla.

Creo que los requisitos de "deben" deben interpretarse como si fueran seguidos implícitamente por "de lo contrario, el programa está mal formado" a menos que se especifique lo contrario. Sin embargo, otros afirman que "deberá" en cambio significa "de lo contrario, el comportamiento no está definido".

En todos los casos que he encontrado en el estándar en el que un requisito "debe" no fue seguido por algo como "de lo contrario el comportamiento no está definido" o "no se requiere diagnóstico", la regla en la que se produjo fue obviamente diagnosticable y es diagnosticado por todos los compiladores que conozco (el párrafo anterior es un ejemplo). Por eso creo que significa "de lo contrario, el programa está mal formado", es decir , se requiere un diagnóstico.

De todos modos, esos son solo mis pensamientos. Apreciaría una respuesta autorizada.


Sí, para estar bien formado, el programa debe seguir la Regla de definición única que ha citado en la pregunta (§1.3.26):

programa bien formado

El programa C ++ se construyó de acuerdo con las reglas de sintaxis, las reglas semánticas diagnosticables y la Regla de una definición (3.2).

Las otras reglas diagnosticables se especifican como (§1.4):

1.4 Cumplimiento de la implementación [intro.compliance]

1 El conjunto de reglas diagnosticables consta de todas las reglas sintácticas y semánticas en esta Norma Internacional, excepto aquellas reglas que contienen una notación explícita de que "no se requiere diagnóstico" o que se describen como resultado de "comportamiento indefinido".
2 Aunque esta Norma Internacional establece solo los requisitos en las implementaciones de C ++, estos requisitos a menudo son más fáciles de entender si están redactados como requisitos en programas, partes de programas o ejecución de programas. Tales requisitos tienen el siguiente significado:
- Si un programa no contiene violaciones de las reglas en esta Norma Internacional, una implementación conforme debe, dentro de sus límites de recursos, aceptar y ejecutar 2 ese programa correctamente.
- Si un programa contiene una violación de cualquier regla diagnosticable o la ocurrencia de una construcción descrita en esta Norma como "soportada condicionalmente" cuando la implementación no es compatible con esa construcción, una implementación conforme emitirá al menos un mensaje de diagnóstico.
- Si un programa contiene una violación de una regla para la cual no se requiere ningún diagnóstico, esta Norma Internacional no impone ningún requisito en las implementaciones con respecto a ese programa.
[énfasis añadido]

Y sí, como se señala en el segundo punto, si se viola una regla diagnosticable, se requiere un diagnóstico.