Oui, ce changement s'explique par des changements dans la langue qui en fait un comportement indéfini si une période indéterminée, la valeur est produite par une évaluation , mais avec quelques exceptions pour les unsigned caractères étroits.
Rapport de défaut 1787
dont le projet de texte peut être trouvé dans N39141 a été récemment accepté en 2014 et est incorporé dans le dernier projet de travail N3936
:
La plus intéressante de changement à l'égard de durée indéterminée de valeurs à la section 8.5
le paragraphe 12 qui va de:
Si aucun initialiseur est spécifié pour un objet, l'objet est par défaut-initialisé; si l'initialisation est effectuée, un objet automatique ou dynamique durée de stockage a une valeur indéterminée. [ Remarque: les Objets statiques ou thread durée de stockage sont initialisé à zéro, voir 3.6.2. - la note de fin ]
(c'est moi qui souligne):
Si aucun initialiseur est spécifié pour un objet, l'objet est
par défaut-initialisé. Lorsque le stockage d'un objet automatique ou
dynamique de la durée de stockage est obtenu, l'objet a une durée indéterminée
valeur, et si aucun d'initialisation est effectuée pour l'objet, qui
l'objet conserve une valeur indéterminée jusqu'à ce que la valeur est remplacée
(5.17 [expr.cul]). [Remarque: les Objets de l'électricité statique ou le fil de stockage
la durée sont initialisé à zéro, voir 3.6.2 [de base.commencer.init]. la fin de l'
remarque] Si une période indéterminée, la valeur est produite par une évaluation, la
le comportement est indéfini, sauf dans les cas suivants:
-
Si une période indéterminée, la valeur de non signé étroit le type de caractère (3.9.1 [de base.fondamentaux]) est produite par l'évaluation de:
la deuxième ou la troisième opérande d'une expression conditionnelle (5.16 [expr.cond]),
l'opérande de droite de la virgule (5.18 [expr.virgule]),
l'opérande de fonte ou de la conversion en unsigned étroit le type de caractère (4.7 [conv.intégrale], 5.2.3 [expr.type.conv], 5.2.9
[expr.statique.distribution], 5.4 [expr.distribution]), ou
un jeté de la valeur de l'expression (article 5 [expr]),
alors le résultat de l'opération est d'une valeur indéterminée.
Si une période indéterminée, la valeur de non signé étroit le type de caractère (3.9.1 [de base.fondamentaux]) est produite par l'évaluation de la droite
opérande d'un simple opérateur d'affectation (5.17 [expr.cul]) dont la première
l'opérande est une lvalue de unsigned étroit le type de caractère, une
indéterminée la valeur remplace la valeur de l'objet visé par l'
l'opérande de gauche.
Si une période indéterminée, la valeur de non signé étroit le type de caractère (3.9.1 [de base.fondamentaux]) est produite par l'évaluation de la
expression d'initialisation lors de l'initialisation d'un objet de type unsigned
étroit le type de caractère, cet objet est initialisé pour une durée indéterminée
de la valeur.
et inclus l'exemple suivant:
[ Exemple:
int f(bool b) {
unsigned char c;
unsigned char d = c; // OK, d has an indeterminate value
int e = d; // undefined behavior
return b ? d : 0; // undefined behavior if b is true
}
- fin de l'exemple ]
On peut trouver ce texte dans N3936 qui est l'actuel projet de travail et d' N3937
est le C++14 DIS
.
Avant C++1y
Il est intéressant de noter que, avant ce projet contrairement à C qui a toujours eu une bien spécifié notion de ce qui utilise des valeurs de durée indéterminée ne sont pas défini C++ utilisé le terme d'une valeur indéterminée, sans même le définir (en supposant que nous ne pouvons pas emprunter définition de C99) et aussi voir le rapport de défaut 616. Nous avons dû compter sur la underspecified lvalue-à-rvalue de conversion qui, dans le projet de C++11 est couvert dans la section 4.1
Lvalue-à-rvalue de conversion de l'alinéa 1 qui dit:
[...]si l'objet est non initialisée, un programme qui nécessite cette conversion a un comportement indéfini.[...]
Notes de bas de page:
-
1787
est une révision de rapport de défaut 616, nous pouvons trouver cette information dans N3903