Les propriétés visées sont les suivantes :
Propriété de substitution
Pour toute quantité a et b et toute expression F(x), si a = b, alors F(a) = F(b) (si les deux côtés ont un sens, c'est-à-dire s'ils sont bien formés).
_Transparence référentielle_
De manière informelle, cela signifie qu'il n'y a pas de différence entre une valeur et une référence à cette valeur (d'où l'origine du terme).
En programmation impérative, c'est un concept difficile à comprendre, car nous sommes habitués à modifier nos variables. Rick Hickey (à l'origine de Clojure) donne une belle conférence sur la distinction entre l'identité et l'État qui pourrait vous aider. L'essentiel est qu'une variable est une identité. À tout moment, une identité fait référence à un état. Un état ne change jamais, mais une identité peut être modifiée pour faire référence à un autre état.
Itérateurs d'entrée
En propriété de substitution la violation est "évidente" ici, si nous définissons F(x)
dans le texte ci-dessus pour signifier ++x
alors nous avons que si les itérateurs d'entrée vérifiaient la propriété de substitution, ce qui suit s'appliquerait a == b => ++a == ++b
.
Ce n'est cependant pas vrai, car l'incrémentation d'un itérateur d'entrée peut invalider tous les autres itérateurs d'entrée de la même source. Extrait du tableau 107 du document n3290 (page 831, juste au-dessus du paragraphe que vous avez cité) :
++r
pre : r est déréférençable.
post : r est déréférençable ou r est past-the-end.
post : toute copie de la valeur précédente de r n'a plus besoin d'être déréférencée ou d'être dans le domaine de ==. déréférencement ou qu'elles soient dans le domaine de ==.
C'est-à-dire que lorsque nous effectuons ++a
entonces b
peut devenir invalide, et donc ++b
lui-même sera un comportement indéfini.
C'est une violation directe de ++a == ++b
Par conséquent, la propriété de substitution ne tient pas.
En transparence référentielle est un peu plus évident ici. Si les itérateurs d'entrée étaient référentiellement transparents, cela signifierait qu'ils seraient indifférenciés de la valeur qu'ils pointent. Il est clair que ce n'est pas le cas, car en appliquant la méthode ++
n'incrémente pas la valeur, mais l'itérateur.