Cette syntaxe a été proposée dans le Concepts TS, mais n'a pas été intégrée dans C++17 pour des raisons de sécurité. diverses raisons .
Malgré certaines critiques que j'ai exposées ci-dessous, elle a été ajoutée dans C++20.
Remarque : la partie suivante de la réponse a été rendue obsolète par la fusion de la norme P1141R2 dans la norme. Je la laisse ici à titre de référence.
Cependant, même si nous obtenons finalement des concepts dans la prochaine itération (probablement C++20), il n'est pas certain que la syntaxe souhaitée soit intégrée à la norme. Dans cet article Richard Smith et James Dennett critiquent la soi-disant "Notations laconiques sur les modèles" en disant
Le TS Concepts introduit trop de syntaxes pour une déclaration de modèle de fonction. Certaines de ces syntaxes n'ont pas de marqueur syntaxique clair et cohérent pour les modèles, ce qui constitue une information sémantique importante pour le lecteur du code (rappelons que le code est beaucoup plus lu qu'il n'est écrit).
Ils proposent ensuite une syntaxe différente pour atteindre cet objectif, tout en gardant les déclarations de modèles plus cohérentes :
\=> Exiger un sigle explicite pour déclarer qu'une fonction est un modèle.
Remplacer
void f(auto a) {}
template<typename T> void g(auto a) {}
avec
template<...> void f(auto a) {}
template<typename T, ...> void g(auto a) {}
Le ... sigil dans le liste de paramètres de modèle indique que des paramètres supplémentaires du modèle seront déduits de la déclaration.
Alors Tl;dr : Il y a un tas de raisons liées à la procédure de normalisation pour lesquelles nous ne l'avons pas dans C++17, et il y a encore plus de raisons pour lesquelles nous ne l'aurons probablement jamais. Si j'ai bien compris l'article, le point clé est que chaque template devrait être introduit avec une balise template
mot-clé.