EDIT : cette question pourrait probablement utiliser un titre plus approprié. N'hésitez pas à en suggérer un dans les commentaires.
En utilisant le C++ avec un grand ensemble de classes, j'ai un jour rencontré une situation dans laquelle const
est devenu une source de tracas, non pas à cause de sa fonctionnalité, mais parce qu'il a une définition très simpliste. Son applicabilité à un entier ou une chaîne de caractères est évidente, mais pour des classes plus compliquées, il y a souvent plusieurs propriétés qui pourraient être modifiées indépendamment les unes des autres. J'imagine que de nombreuses personnes ont dû apprendre ce que le mutable
mot-clé fait pourrait avoir eu des frustrations similaires.
L'exemple le plus évident pour moi serait une classe de matrice, représentant une transformation 3D. Une matrice représentera à la fois une translation et une rotation, chacune d'entre elles pouvant être modifiée sans modifier l'autre. Imaginez la classe et les fonctions suivantes avec l'ajout hypothétique de "multi-property const".
class Matrix {
void translate(const Vector & translation) const("rotation");
void rotate(const Quaternion & rotation) const("translation");
}
public void spin180(const("translation") & Matrix matrix);
public void moveToOrigin(const("rotation") & Matrix matrix);
Ou imaginez des mots-clés const prédéfinis comme "_comparable" qui vous permettent de définir des fonctions qui modifient l'objet à volonté tant que vous promettez de ne rien changer qui affecterait l'ordre de tri de l'objet, facilitant ainsi l'utilisation d'objets dans des conteneurs triés.
Quels seraient les avantages et les inconvénients de ce type de fonctionnalité ? Pouvez-vous imaginer une utilisation pratique de cette fonctionnalité dans votre code ? Existe-t-il une bonne approche pour réaliser ce type de fonctionnalité avec la fonctionnalité actuelle du mot-clé const ?
Gardez à l'esprit
- Je sais qu'une telle fonctionnalité linguistique pourrait facilement faire l'objet d'abus. On peut dire la même chose de nombreuses caractéristiques du langage C++.
- Comme
const
Je m'attendrais à ce qu'il s'agisse d'une fonctionnalité strictement liée à la compilation. - Si vous pensez déjà
const
est la chose la plus stupide depuis la boue tranchée, je considère que vous pensez la même chose à ce sujet. Pas besoin de poster, merci.
EDIT : En réponse au commentaire de SBK sur le marquage des membres, je suggère que vous n'en avez pas. Pour les classes / membres marqués const, cela fonctionne exactement comme cela a toujours été le cas. Pour tout ce qui est marqué const("foo"), il traite tous les membres comme mutables, sauf indication contraire, laissant à l'auteur de la classe le soin de s'assurer que ses fonctions fonctionnent comme prévu. En outre, dans une matrice représentée en interne comme un tableau 2D, vous ne pouvez pas marquer les champs individuels comme const ou non const pour la translation ou la rotation, car tous les degrés de liberté se trouvent dans une seule déclaration de variable.