j'ai ce code
template<int N, bool C = true>
struct A;
template<int N>
struct A<N,!(N % 5)> {
/*... */
};
// should work
A<25> a;
Autrement dit, pour les nombres N
divisibles par 5
, le compilateur doit utiliser la spécialisation partielle. Mais le compilateur n'acceptera pas cette spécialisation partielle, car la norme l'oblige à rejeter un tel code où un argument non-type d'une spécialisation partielle fait référence à un paramètre et n'est pas simplement un paramètre (comme, A<N, N>
serait valide). Mais quelle est la raison de le faire?
Notez que je peux simplement changer mon code en un exemple plus verbeux et il est valide
template<bool> struct wrap;
template<int N, typename = wrap<true> >
struct A;
template<int N>
struct A<N, wrap<!(N % 5)> > {
/*... */
};
// should work
A<25> a;
C'est bien parce que ce n'est plus un paramètre non-type. Mais quelle est la raison pour laquelle la spécification interdit la spécialisation partielle plus simple ?
Solution du problème
Je pense que c'est en grande partie historique. Les paramètres de modèle non typés n'étaient pas du tout autorisés à l'origine. Quand ils ont été ajoutés, il y avait beaucoup de limitations. Au fur et à mesure que les gens essayaient différentes possibilités et confirmaient qu'elles ne causaient pas de problèmes, certaines limitations ont été supprimées.
Certaines de ces limitations originales restent sans raison particulière au-delà du fait que personne n'a pris la peine de travailler à les changer. Tout comme là-bas, beaucoup d'entre eux peuvent être contournés, de sorte que les supprimer ne causerait généralement pas de difficulté particulière. La plupart du temps, il s'agit de savoir si quelqu'un s'intéresse suffisamment à ce cas particulier pour écrire un article à ce sujet.
Aucun commentaire:
Enregistrer un commentaire