Imaginons que nous avons une structure pour la tenue de 3 chambres doubles avec certaines fonctions de membre:
struct Vector {
double x, y, z;
// ...
Vector &negate() {
x = -x; y = -y; z = -z;
return *this;
}
Vector &normalize() {
double s = 1./sqrt(x*x+y*y+z*z);
x *= s; y *= s; z *= s;
return *this;
}
// ...
};
C'est un peu artificiel, pour des raisons de simplicité, mais je suis sûr que vous acceptez que le même code est là. Les méthodes vous permettent de chaîne, par exemple:
Vector v = ...;
v.normalize().negate();
Ou encore:
Vector v = Vector{1., 2., 3.}.normalize().negate();
Maintenant, si nous avons fourni begin() et end() fonctions, nous pourrions utiliser notre Vecteur dans un nouveau style pour la boucle, dire à de la boucle sur les 3 coordonnées x, y et z (vous pouvez sans aucun doute construire plus "utile" exemples de par le remplacement de Vecteur avec par exemple une Chaîne de caractères):
Vector v = ...;
for (double x : v) { ... }
Nous pouvons même le faire:
Vector v = ...;
for (double x : v.normalize().negate()) { ... }
et aussi:
for (double x : Vector{1., 2., 3.}) { ... }
Cependant, la suite (il me semble) est cassé:
for (double x : Vector{1., 2., 3.}.normalize()) { ... }
Alors qu'il semble comme une combinaison logique des deux précédents usages, je pense que ce dernier usage crée une balançant de référence, tandis que les deux précédentes sont tout à fait acceptable.
- Est-ce correct et Largement apprécié?
- La partie de la ci-dessus est la "mauvaise" partie, qui doit être évitée?
- Serait la langue être améliorée en modifiant la définition de la gamme à base de boucle tels que temporaires construits dans l'expression existent pour la durée de la boucle?