Imaginons que nous ayons une structure pour contenir 3 doubles avec des fonctions membres:
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 la simplicité, mais je suis sûr que vous êtes d'accord pour dire qu'un code similaire existe. Les méthodes vous permettent d'enchaîner facilement, par exemple:
Vector v = ...;
v.normalize().negate();
Ou même:
Vector v = Vector{1., 2., 3.}.normalize().negate();
Maintenant, si nous avons fourni les fonctions begin () et end (), nous pourrions utiliser notre Vector dans un nouveau style for loop, disons pour faire une boucle sur les 3 coordonnées x, y et z (vous pouvez sans doute construire plus d'exemples "utiles" en remplaçant Vector par eg String):
Vector v = ...;
for (double x : v) { ... }
On peut même faire:
Vector v = ...;
for (double x : v.normalize().negate()) { ... }
et aussi:
for (double x : Vector{1., 2., 3.}) { ... }
Cependant, ce qui suit (il me semble) est cassé:
for (double x : Vector{1., 2., 3.}.normalize()) { ... }
Bien que cela semble être une combinaison logique des deux utilisations précédentes, je pense que cette dernière utilisation crée une référence pendante alors que les deux précédentes sont tout à fait correctes.
- Est-ce correct et largement apprécié?
- Quelle partie de ce qui précède est la "mauvaise" partie, qui devrait être évitée?
- Le langage serait-il amélioré en modifiant la définition de la boucle for basée sur la plage de sorte que les temporels construits dans l'expression for existent pendant la durée de la boucle?