tl;dr : Le site séquence des modifications et des lectures effectuées dans (i+=10)+=10
est bien défini en C++98 et C++11, cependant en C++98 cela n'est pas suffisant pour rendre le comportement défini.
En C++98, des modifications multiples d'un même objet sans qu'il y ait une intervention de la part de l'utilisateur sont possibles. point de séquence entraîne un comportement indéfini, même lorsque l'ordre de ces modifications est bien spécifié. Cette expression ne contient aucun point de séquence et donc le fait qu'elle consiste en deux modifications est suffisant pour rendre son comportement indéfini.
C++11 n'a pas de points de séquence et exige seulement que les modifications d'un objet soient ordonnées les unes par rapport aux autres et par rapport aux lectures du même objet pour produire un comportement défini.
Par conséquent, le comportement est indéfini en C++98 mais bien défini en C++11.
C++98
Clause C++98 [expr] 5 p4
Sauf indication contraire, l'ordre d'évaluation des opérandes des opérateurs individuels et des sous-expressions des expressions individuelles, ainsi que l'ordre dans lequel les effets secondaires se produisent, ne sont pas spécifiés.
Clause C++98 [expr.ass] 5.17 p1
Le résultat de l'opération d'assignation est la valeur stockée dans l'opérande de gauche après que l'assignation ait eu lieu ; le résultat est une lvalue.
Je crois donc que l'ordre est spécifié, cependant je ne vois pas que cela suffise à créer un point de séquence au milieu d'une expression. Et pour continuer avec la citation de [expr] 5 p4 :
Entre le point de séquence précédent et le suivant, la valeur stockée d'un objet scalaire doit être modifiée au maximum une fois par l'évaluation d'une expression.
Ainsi, même si l'ordre est spécifié, il me semble que cela n'est pas suffisant pour un comportement défini en C++98.
C++11
Le C++11 supprime les points de séquence au profit de l'idée beaucoup plus claire de séquence avant y séquencé-après . Le langage de C++98 est remplacé par
C++11 [intro.exécution] 1.9 p15
Sauf indication contraire, les évaluations des opérandes des opérateurs individuels et des sous-expressions des expressions individuelles ne sont pas séquencées. [...]
Si un effet secondaire sur un objet scalaire n'est pas séquencé par rapport à un autre effet secondaire sur le même objet scalaire ou un calcul de valeur utilisant la valeur du même objet scalaire, le comportement est indéfini.
C++11 [expr.ass] 5.17 p1
Dans tous les cas, l'affectation est séquencée après le calcul de la valeur des opérandes de droite et de gauche, et avant le calcul de la valeur de l'expression d'affectation.
Ainsi, alors que le fait d'être ordonné n'était pas suffisant pour obtenir le comportement défini dans C++98, C++11 a modifié l'exigence de sorte que le fait d'être ordonné (c'est-à-dire séquencé) est suffisant.
(Et il me semble que la flexibilité supplémentaire offerte par "séquence avant" et "séquence après" a conduit à un langage beaucoup plus clair, cohérent et bien spécifié).
Il me semble peu probable qu'une implémentation de C++98 fasse quelque chose de surprenant lorsque la séquence d'opérations est bien spécifiée, même si cela est insuffisant pour produire un comportement techniquement bien défini. Par exemple, la représentation interne de cette expression produite par Clang en mode C++98 a un comportement bien défini et fait la chose attendue.