La norme C ++ spécifie-t-elle que dans certains cas, la compilation doit échouer avec une erreur?

Je vérifie la norme sur la réduction de la conversion et je pense qu’une erreur devrait être déclenchée pour une conversion réduite. Parce que la norme dit:

[Remarque: comme indiqué ci-dessus, ces conversions ne sont pas autorisées au niveau supérieur des initialisations de liste. – note de fin]

Je pense que la description de “non autorisé” signifie que la compilation devrait échouer.

Mais quelqu’un m’a dit qu’ici dit simplement “le programme est mal formé” et que la norme n’exigera pas que la compilation échoue.

si une conversion ressortingctive (voir ci-dessous) est nécessaire pour convertir l’élément en T, le programme est mal formé.

Ma question est donc la suivante: la norme spécifie-t-elle si une erreur ou un avertissement doit être généré? Ou dans certains cas, la compilation devrait échouer? En ce qui concerne le compilateur, est-il possible de comstackr le programme et de donner des avertissements?

BTW: Clang 4.0.0 et Gcc 7.0.0 se comportent différemment.

float a {1.e39}; // Error for both Clang and GCC double d; float a3{d}; // Error for Clang, warning for GCC 

La norme n’utilise pas les termes “erreur” et “avertissement”, elle ne parle que des cas où le compilateur doit “émettre un diagnostic”.

Dans votre exemple, si le programme est “mal formé”, le compilateur doit vous dire que, d’une manière ou d’une autre – émettre un diagnostic.

Après cela, il peut faire tout ce qu’il veut – y compris quand même comstackr et exécuter le programme. La norme spécifie uniquement ce qui se passe pour le code conforme, tout le rest n’est pas défini. Et puis, comme nous le soaps, tout peut arriver.

La seule condition requirejse pour un programme mal formé est que le compilateur doit “émettre un diagnostic”, où “diagnostic” a un sens défini par l’implémentation. Ceci fait, le compilateur est libre de continuer à comstackr le code. C’est le crochet principal du comportement spécifique à l’implémentation.

Si un programme n’est pas mal formé, le compilateur doit produire une sortie exécutable. Si le programme ne contient pas d’UB, l’exécutable doit se comporter comme la machine abstraite. La norme décrit les états auxquels il se comportera. S’il contient UB, l’exécutable peut tout faire.

Si le programme est mal formé et qu’aucun diagnostic n’est requirejs, le compilateur peut tout faire. Il peut produire une sortie exécutable ou non. Cette sortie exécutable peut tout faire. Il pourrait concevoir un programme qui semble correspondre à l’intention du code, par exemple.

Les compilateurs sont libres d’imprimer les diagnostics quand ils le souhaitent.

Les compilateurs ont le mandat d’imprimer les diagnostics dans certaines situations. “La plupart” des programmes mal formés nécessitent un diagnostic. Qu’est-ce qu’un diagnostic est exactement est mise en œuvre définie. Il a été noté qu’imprimer une seule nouvelle ligne vierge, ou un espace, est un diagnostic valide selon la norme.

Cela serait considéré comme une mauvaise qualité de mise en œuvre.

Une fois que le diagnostic est imprimé lorsqu’un programme mal formé nécessite un diagnostic, le compilateur est libre de faire n’importe quoi. Il peut produire un exécutable qui correspond quelque peu à ce que vous demandez, un exécutable qui fait tout ce qu’il veut ou ne produire aucun exécutable.

La norme ne fait pas la distinction entre les avertissements et les erreurs.

Un programme mal formé qui nécessite un diagnostic qui affiche un avertissement, puis continue à comstackr, ne contrevient pas à la norme.

Un programme mal formé qui nécessite un diagnostic qui imprime une erreur, puis ne continue pas à comstackr, ne contrevient pas à la norme.

Un programme mal formé sans diagnostic requirejs peut imprimer un diagnostic. Il peut choisir de produire un exécutable ou non. L’exécutable peut faire quelque chose de raisonnable ou non.

Un programme bien formé peut demander au compilateur d’émettre un diagnostic. Ce diagnostic peut être décrit comme un avertissement. Cela pourrait également être décrit comme une erreur, mais le compilateur doit produire un fichier exécutable, qui doit remplir les mandats standard.

Si un programme n’est pas mal formé (et n’a pas d’UB), le compilateur doit produire une sortie exécutable. Si un programme est mal formé, la norme ne pose aucune ressortingction quant à la présence ou non d’une sortie.

Si un programme est mal formé et qu’il ne s’agit pas d’un rapport de non-remise, un diagnostic doit être établi. La norme ne fait pas de distinction entre les avertissements et les erreurs.

Les notes de la norme ne sont pas normatives et n’affectent pas la définition de la langue. La note dans votre première citation n’est donc pas importante du sharepoint vue des juristes spécialisés

Cela dit, je pense que vos deux citations signifient la même chose. Un “programme mal formé” est un programme qui n’est pas construit selon les règles de syntaxe, les règles sémantiques diagnosticables et une règle de définition du standard (l’emphase mien). Si une certaine sémantique est “non autorisée”, cela signifie simplement qu’elle viole une règle sémantique diagnostiquable des langugae, et donc simplement qu’elle est mal formée.

Le compilateur doit émettre un diagnostic pour un programme mal formé. Après cela, le compilateur peut faire tout ce qu’il veut. La norme ne spécifie aucune condition dans laquelle la compilation doit échouer.