J'ai un projet qui utilise actuellement C++ 11/14, mais il nécessite quelque chose comme std::filesystem
, qui est uniquement disponible en C++ 17 et, par conséquent, je n'ai pas la chance de l'utiliser actuellement. Je vois cependant qu'il est disponible dans mon compilateur actuel en tant que std::experimental::filesystem
. Est-ce une bonne idée d'utiliser des fonctionnalités expérimentales, en supposant que je puisse à l'avenir ajouter quelque chose comme:
#ifdef CXX17 //if this is C++17
std::filesystem::something ...;
#else
std::experimental::filesystem::something ...;
#endif
Mes préoccupations sont:
1. Est-il garanti que tous les compilateurs conformes ont les mêmes fonctionnalités expérimentales?
2. Les fonctionnalités expérimentales sont-elles sujettes à de grands changements qui les rendent peu fiables?
Peut-être qu'il y a plus de choses à s'interroger. Pourquoi devrais-je ou ne devrais-je pas les utiliser? Je suis perplexe avec un nouveau projet et je ne sais pas quoi décider.
- Est-il garanti que tous les compilateurs conformes ont les mêmes fonctionnalités expérimentales?
Non, les fonctionnalités expérimentales sont facultatives.
- Les fonctionnalités expérimentales sont-elles sujettes à de grands changements qui les rendent peu fiables?
Oui, le comité C++ peut même décider d’abandonner une fonctionnalité ou lors du processus de normalisation, un défaut susceptible de modifier une fonctionnalité peut survenir.
Généralement, ce n'est pas une bonne idée de dépendre de fonctionnalités expérimentales. Les caractéristiques expérimentales correspondent exactement à ce que dit la Parole (c’est-à-dire expérimenter).
Un membre de l'auditoire a posé une question lors de la conférence "C++ Standard Library" lors de la conférence CppCon 2016 ( YouTube ) sur le potentiel du nom experimental
pour dissuader les utilisateurs d'utiliser quoi que ce soit dans la liste. espace de noms:
Est-ce que vous considérez que le contenu de l'espace de noms
std::experimental
Est prêt et qu'un argument peut être avancé, qu'il est effectivement prêt pour la production pour les trois prochaines années et que vous devez peut-être modifier votre code 3 ans plus tard peut-être?
Michael Wong (président de SG5 et SG14 et rédacteur en chef de Concurrency TS) a d'abord répondu à la question:
Je pense qu’il existe un fort consensus au sein du comité selon lequel le produit est pratiquement prêt à la production. Comme je l'ai déjà dit, dans la plupart des cas, 99% de ces déchets sont déversés dans l'air. Nous voulons nous assurer que cela ne vous empêche pas de les utiliser. Vous pouvez comprendre pourquoi nous voulons placer de grandes fonctionnalités, de grands groupes de fonctionnalités, dans un tel contexte, de manière à ne pas perturber le reste du système de bibliothèque, mais cela facilite également son utilisation. Vous pouvez maintenant activer GCC avec un indicateur spécifique pour Concepts, ce qui vous permet en fait de le segmenter plus facilement.
Alisdair Meredith (ancien président du LWG) a ensuite poursuivi:
Je vais prendre la position contraire ici. Herb [Sutter] a notamment déclaré, en tant que responsable du groupe de travail standard WG21, que lorsque nous nous sommes engagés sur la voie des TS, il ne pensait pas que les TS auraient réussi tant que nous n'aurions pas réussi à faire avancer les choses. signifie que nous ne sommes pas assez expérimentaux, nous ne sommes pas assez ambitieux dans l'utilisation des TS. Nous voulons vraiment que
experimental
soit un indice que, oui, ces choses sont sujettes à changement, nous ne sommes pas liés à cela et nous pouvons nous tromper. Cela vise à réduire les obstacles que nous considérons comme étant aussi ambitieux que possible [...] Maintenant que la norme semble être sur un cycle de publication de trois ans, nous devrions être beaucoup plus ambitieux en proposant des fonctionnalités réellement expérimentales. TS et peut-être faire avancer les choses plus rapidement dans la norme principale elle-même. Mais là encore, ce sera un sujet amusant pour nous lors des prochaines réunions du [comité de standard C++].
Stephan T. Lavavej (responsable de l'implémentation STL de Microsoft) a été le dernier à répondre:
Il est important de faire la distinction entre le caractère expérimental de l'interface et le caractère expérimental de la mise en œuvre, car lorsque vous parlez de "production prête", qu'est-ce que cela signifie? Habituellement, "prêt pour la production", on pourrait penser à cela en parlant de la mise en œuvre. Il est tout à fait possible qu'une implémentation [de quelque chose dans
std::experimental
] Soit absolument [...] à l'épreuve des balles. [...] Quelque chose comme [...] l'en-tête<random>
Dans TR1, [c'était] vraiment, vraiment gentil dans TR1, et vous auriez pu avoir une implémentation absolument infaillible de cela, mais s'est avéré que l'interface avait beaucoup tourné [avant la sortie de] C++ 11 et [...] si nous savions à l'époque ce que nous faisons maintenant, mettre unexperimental
aurait été un meilleur signal pour les gens ça, "Hey, peut-être que vous ne voulez pas utiliserstd::experimental::variate_generator
parce que, ah, ah, ça va disparaître en C++ 11".
Il semble donc que les concepteurs de bibliothèques standard et les membres du comité souhaitent que le contenu de l'espace de noms std::experimental
Soit véritablement de nature "expérimentale" et qu'il ne faut pas le prendre pour acquis que quelque chose dans std::experimental
sera dans la norme C++.
Et non, pour autant que je sache, il appartient aux éditeurs de bibliothèques standard de décider s’ils fournissent ou non des implémentations des différentes fonctionnalités dans std::experimental
.
"Expérimental" est un terme légèrement exagéré. La bibliothèque filesystem
est originaire de Boost et y a parcouru quelques itérations avant d'être soumise à l'ISO.
Cependant, les normes ISO sont intentionnellement très prudentes. Le qualifier de expérimental signifie qu'ISO ne garantit pas explicitement que le nom sera stable; Il est parfaitement clair que vous devrez ré-adresser votre code dans le futur. Mais connaissant l'ISO, il y aura probablement des indications sur la manière de procéder.
Quant à la compatibilité entre les compilateurs, attendez-vous à ce qu'elle soit raisonnable. Mais il y aura des cas critiques (pensez aux chemins relatifs au lecteur Windows par exemple), et c'est exactement pourquoi une future norme pourrait casser votre code existant. Idéalement, le code serait cassé si et seulement si vous dépendiez de ce cas, mais ce n'est pas une garantie.
Peut-être qu'il y a plus de choses à s'interroger.
Quelques points à considérer:
A quel point votre projet est-il multiplateforme? Si un seul compilateur est impliqué, vous pouvez vérifier son implémentation et son historique pour décider. Ou leur demander!
Quelle est la taille de votre base de code? Quelle serait l'ampleur de l'impact des changements?
Dans quelle mesure les fonctionnalités fournies par l’API/bibliothèque/fonctionnalité sont-elles fondamentales pour votre projet?
Quelles sont les alternatives?
experimental::
, ou aussi difficile que de contourner le problème.experimental
un échouerait ou disparaîtrait.