La sp�cification du C++17 n'int�grera pas les concepts
D�couvrez les raisons logiques et techniques de son absence
La nouvelle sp�cification du C++, nomm�e C++17 approche � grands pas. Toutefois, la fonctionnalit� des concepts n'int�grera pas la future sp�cification. Tom Honermann explique sur son blog les raisons faisant que c'�tait improbable, voire impossible.
Toutefois, avant de d�crire ces raisons, rappelons ce que sont les concepts.
Prenons le concept suivant :
Celui-ci indique que n�importe quel type ayant un operator< et qui prend en param�tre deux objets et retournant un bool�en sera consid�r� comme un LessThanComparable. Ensuite, il est possible d�utiliser le concept pour restreindre les types pouvant �tre pass�s � un template.
Code c++ : S�lectionner tout - Visualiser dans une fen�tre � part
1
2
3 auto concept LessThanComparable<typename T> { bool operator<(T, T); }
Le but des concepts est d'apporter une solution � un manque du C++. En effet, m�me s'il est possible de contourner le manque, il est impossible d'apporter une solution propre. Gr�ce aux concepts il devient possible :
- de contraindre les arguments d'une fonction sans pour autant d�sactiver la d�duction de ceux-ci et sans g�ner la meta arity des fonctions templates ainsi contraintes. Prenons l�exemple suivant :
L�exemple est plut�t simple. Toutefois, nous aimerions ajouter une interface. Pour ce faire, nous voudrions contraindre les param�tres de la fonction :
Code c++ : S�lectionner tout - Visualiser dans une fen�tre � part template <class T> void f(T);
Mais ce faisant, nous avons perdu la d�duction des arguments. Aussi, cela ne fonctionnera pas pour les constructeurs templates. Une seconde approche serait :
Code c++ : S�lectionner tout - Visualiser dans une fen�tre � part template <class T> void f(enable_if_t<my_trait_v<T>, T>);
La contrainte du param�tre se situe dans le type de retour. Toutefois, cela ne marche toujours pas pour les constructeurs templates. Ce que nous pouvons corriger en ajoutant une contrainte sur l�argument template :
Code c++ : S�lectionner tout - Visualiser dans une fen�tre � part template <class T> auto f(T) -> enable_if_t<my_trait_v<T>, void>;
Malheureusement, la meta arity est pass�e de 1 � 2. De plus, ce n��tait que des contournements alors qu�avec les concepts nous pourrions faire :
Code c++ : S�lectionner tout - Visualiser dans une fen�tre � part template <class T, typename = enable_if_t<my_trait_v<T>>> void f(T);
Code c++ : S�lectionner tout - Visualiser dans une fen�tre � part void f(MyConcept);- d��crire plus facilement des surcharges tout en ayant des contraintes exclusives mutuellement. Il est souvent souhait� de pouvoir utiliser telle ou telle surcharge suivant certaines conditions sur les templates. Pour r�ussir, on pourrait �crire :
Ce code est dangereux. On peut facilement en arriver � ce point si on ne souhaite pas cr�er de trait (car c�est l�unique utilisation). De plus, les r�f�rences ne sont pas g�r�es, la contrainte peut �tre ignor�e en passant deux arguments � la fonction. Avec les concepts, nous pourrions �crire :
Code c++ : S�lectionner tout - Visualiser dans une fen�tre � part template <class T> void f(T, decltype(declval<T>().f())* = 0);
Les surcharges sont mutuellement exclusives.
Code c++ : S�lectionner tout - Visualiser dans une fen�tre � part
1
2 template <class T> void f(T) requires requires (T t) {t.f();}; template <class T> void f(T);- d��crire des contraintes aussi originales que n�cessaires.
Malgr� tout l�int�r�t que peuvent avoir les concepts, ceux-ci n'int�greront pas le prochain standard. En effet, plusieurs choses ne sont pas encore claires :
- la sp�cification des concepts a �t� publi�e le 15 novembre 2015, laissant peu de temps pour un retour efficace et fiable ;
- la seule impl�mentation est dans une version non publi�e de GCC ;
- l�impl�mentation r�alis�e dans GCC a �t� r�alis�e par l�auteur de la sp�cification. Il n�y a donc pas eu d�avis externe sur la question de l�impl�mentation dans GCC ou dans les autres compilateurs ;
- seuls quelques projets utilisent les concepts, mais la sp�cification n�a pas �t� assez mise � l��preuve dans des cas r�els ;
- la sp�cification ne fournit pas de biblioth�que de d�finitions de concepts. Donc il n�est pas possible de savoir si l��criture d�une telle biblioth�que est possible.
Toutefois, m�me si tous ces points avaient �t� r�gl�s, Tom Honermann doute de l�int�gration des concepts � la sp�cification du langage. En effet :
- les concepts apportent une nouvelle �criture pour les templates. Toutefois, une fonction template abr�g�e peut �tre identique � une fonction non template. Le type serait le seul indicateur pour savoir si la fonction est non template ou si elle est template :
Code c++ : S�lectionner tout - Visualiser dans une fen�tre � part void f(X x) {}- la proposition d�finit une nouvelle syntaxe pour d�clarer des templates respectant une contrainte :
toutefois, cette syntaxe n�est pas appr�ci�e ;
Code c++ : S�lectionner tout - Visualiser dans une fen�tre � part C{A,B} void f(A a, B b);- l�utilisation d�un concept n�cessite de conna�tre comment il a �t� d�fini (fonction ou variable). Cela apporte confusion et est source d�erreurs ;
- les concepts sont attendus pour am�liorer les messages d�erreur. Toutefois, l�utilisation erron�e des concepts peut apporter des erreurs encore plus denses qu�� l�accoutum�e li�es � la surcharge des fonctions ;
- de nombreuses autres questions ont �t� soulev�es et ne pourront �tre r�pondues qu�� travers des tentatives d�utilisation.
M�me si ce constat est malheureux pour tout utilisateur du langage souhaitant les concepts au plus t�t, ces derniers devraient arriver dans la prochaine sp�cification. De plus, il y a de grandes chances pour que chaque compilateur propose une impl�mentation bien avant la compl�tion du futur standard. Finalement, ce retard permet d�affiner l�impl�mentation et ainsi, au comit� de proposer une meilleure fonctionnalit�.
Votre opinion
Aviez-vous d�j� imagin� des cas d�utilisation pour les concepts ? Quels sont-ils ?
Quelles autres fonctionnalit�s du C++ attendez-vous ?
Source
Blog de Tom Honermann
IsoCPP
Partager