Ces traits proviennent de Boost et de la proposition de les ajouter à la norme, N1345 , cite les propos d'Andrei Alexandrescu :
"Je comprends l'argument de la symétrie pour ajouter add_const
, add_volatile
, add_cv
y add_pointer
Cependant, je plaiderais en faveur de leur élimination. Les équivalents fournis par le langage sont tout simplement plus simples et plus agréables."
La même proposition donne également ce raisonnement :
Note de l'auteur : superficiellement, les classes add_const, add_volatile et add_cv ne sont pas pertinentes, puisque, par exemple, add_const::type est identique à T const, pour tous les T (actuellement, cela ne s'applique pas aux types de fonction - mais numéro 295 aborde cette question). Cependant, l'expérience de Boost est que plusieurs utilisateurs ont demandé que ces modèles soient présents dans la bibliothèque pour les raisons suivantes : (a) Certains utilisateurs les trouvent plus explicites - lorsqu'ils combinent des modèles de transformation en particulier, les utilisateurs apprécient le type de "documentation intégrée" que ces modèles fournissent. (b) Tous les utilisateurs ne savent pas que la cv-qualification d'une référence est autorisée et n'a aucun effet, ou que la cv-qualification d'un type qui est déjà cv-qualifié est autorisée et n'a aucun effet. (c) Les compilateurs peuvent émettre des avertissements lors de la qualification en cv d'un type qui est une référence, ou qui a déjà un qualificateur en cv, ces modèles peuvent être implémentés de telle sorte que ces messages soient supprimés dans ces cas.
De même, pour add_reference
(renommé en add_lvalue_reference
dans la norme) :
Note de l'auteur : le modèle add_reference était l'une des motivations initiales de la bibliothèque de traits de type boost. Cependant, la résolution de numéro 106 fait que le modèle semble largement redondant. Malgré cela, add_reference peut s'avérer utile pour supprimer les avertissements du compilateur lors de la création par inadvertance de références à des références dans le code du modèle.