C++0x va rendre le code suivant et d'autres codes similaires mal formés, parce qu'ils requièrent un élément appelé réduction de la conversion d'un double
à un int
.
int a[] = { 1.0 };
Je me demande si ce type d'initialisation est beaucoup utilisé dans le code du monde réel. Combien de codes seront cassés par ce changement ? Est-ce que cela demande beaucoup d'efforts de corriger cela dans votre code, si votre code est affecté ?
Pour référence, voir 8.5.4/6 de la n3225.
Une conversion restrictive est une conversion implicite
- d'un type à virgule flottante à un type entier, ou
- d'un double long à un double ou à un flottant, ou d'un double à un flottant, sauf lorsque la source est une expression constante et que la valeur réelle après conversion se situe dans la plage des valeurs qui peuvent être représentées (même si elle ne peut pas être représentée exactement), ou
- d'un type entier ou d'un type d'énumération non spécifié à un type à virgule flottante, sauf lorsque la source est une expression constante et que la valeur réelle après conversion s'insère dans le type cible et produit la valeur originale lorsqu'elle est reconvertie dans le type d'origine ; ou
- d'un type entier ou d'un type d'énumération non spécifié vers un type entier qui ne peut pas représenter toutes les valeurs du type original, sauf si la source est une expression constante et que la valeur réelle après conversion s'insère dans le type cible et produit la valeur originale lorsqu'elle est reconvertie dans le type original.
0 votes
J'espère que non, je ne vois pas ce type d'initialisation mais ils ont assuré qu'ils faisaient de leur mieux pour ne pas casser la base de code, C++0x a quand même de bonnes améliorations.
0 votes
@litb : Est-ce que cela sera aussi mal formé, ou est-ce que c'est seulement quand il y a une conversion qui a lieu ?
int a[10] = {0};
1 votes
En supposant que cela ne soit valable que pour l'initialisation des types intégrés, je ne vois pas en quoi cela pourrait nuire. Bien sûr, cela peut casser du code. Mais cela devrait être facile à corriger.
0 votes
J'espère que non, il y a beaucoup de code hérité où je travaille où ce type de conversion est fait au hasard ! Une chose est sûre, l'utilisation de C++0x en production est une utopie pour le moment :)
1 votes
@John Dibling : Non, l'initialisation n'est pas mal formée lorsque la valeur peut être exactement représentée par le type cible. (Et
0
est déjà unint
de toute façon.)2 votes
@Nim : Notez que ce n'est mal formé qu'à l'intérieur d'un pays.
{
initialisateurs d'accolades}
et la seule utilisation ancienne de ceux-ci est pour les tableaux et les structures POD. De plus, si le code existant a des castings explicites là où ils doivent être, il ne sera pas cassé.0 votes
Donc en fait, selon les règles,
unsigned char x = { -1 };
sera mal formé, tout commeunsigned char x = { ~0 };
sur une machine à complément à deux :)0 votes
@litb, @aschepler : OK. Ouf !
0 votes
@Johannes : Pourriez-vous également poster la formulation qui interdit la conversion restrictive dans ce contexte (ou au moins un pointeur vers la bonne section du projet) ? Merci.
0 votes
Comme indiqué ci-dessous, je sais qu'au moins une grande partie du code OpenGL sera affectée (tableaux de sommets à flotteurs contre coordonnées à base d'entiers dans la base de code, etc.) Je suppose qu'il y a plus d'exemples où l'interfaçage avec des API de style C est nécessaire.
0 votes
@litb : Y a-t-il une raison pour laquelle vous avez opté pour la déclaration d'un tableau plutôt que pour un simple
int a = 1.0;
oint a; a = 1.0;
?4 votes
@j_random_hacker comme le dit le document de travail,
int a = 1.0;
est toujours valable.1 votes
@litb : Merci. En fait, je trouve cela compréhensible mais décevant -- il aurait été bien mieux d'exiger une syntaxe explicite pour toutes les conversions de restriction dès le début du C++.