Cela ressemble à un bogue gcc, la documentation de -Wno-div-by-zero
dit clairement :
N'avertissez pas de la division par zéro au moment de la compilation. La division en virgule flottante par zéro n'est pas mise en garde, car elle peut être un moyen légitime d'obtenir des infinis et des NaN.
et après les conversions arithmétiques habituelles couvertes dans [expr.arith.conv] les deux opérandes seront doubles :
De nombreux opérateurs binaires qui attendent des opérandes de type arithmétique ou énumération provoquent des conversions et produisent des types de résultats de la même manière. Le but est de produire un type commun, qui est également le type du résultat. Ce modèle est appelé les conversions arithmétiques habituelles, qui sont définies comme suit:
...
- Sinon, si l'un des opérandes est double, l'autre doit être converti en double.
et [expr.mul] :
Les opérandes de * et / doivent avoir un type d'énumération arithmétique ou sans portée; les opérandes de% doivent être de type énumération intégrale ou non cadrée.
Les conversions arithmétiques usuelles sont effectuées sur les opérandes et déterminent le type du résultat.
En ce qui concerne la question de savoir si la division en virgule flottante par zéro est un comportement indéfini et la manière dont une implémentation différente la traite, je pense que ma réponse ici . TL, DR; Il semble que gcc soit conforme à l' Annexe F en ce qui concerne la division en virgule flottante par zéro, donc undefined ne joue pas un rôle ici. La réponse serait différente pour clang.