J'ai un projet qui utilise actuellement C ++ 11/14, mais il nécessite quelque chose comme std::filesystem
, qui n'est disponible qu'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 pourrais à 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?
Il y a peut-être plus de choses à se demander. Pourquoi devrais-je ou ne devrais-je pas les utiliser? Je suis perplexe face à un nouveau projet et je ne sais pas quoi décider.
la source
#idef CXX17
. À mon humble avis, le moyen portable est de mettre tout le code lié au système de fichiers dans une seule unité de compilation (peut être une classe), de l'utiliser dans les parties restantes du code, de le coder avec la norme actuelle C ++ 11/14. Documentez comment et pourquoi vous l'écrivez comme ça, et portez-le finalement en C ++ 17 plus tard pendant une phase de maintenance, si cela a du sens. (commentant la question d'origine)filesystem
vous encourez beaucoup moins de risques en l'utilisant que d'autres choses, car vous savez déjà qu'il est normalisé en C ++ 17 et que la spécification exacte en C ++ 17 est disponible publiquement. Donc, tout ce que vous avez à faire est de vous assurer que vous n'utilisez que lesexperimental::filesystem
fonctionnalités qui sont dans la spécification C ++ 17. Et bien sûr, vous devez savoir que toutes vos plates-formes ciblées prennent en charge l'un desexperimental::filesystem
ou le C ++ 17std::filesystem
.Réponses:
Non, les fonctionnalités expérimentales sont facultatives.
Oui, le comité C ++ pourrait même décider d'abandonner une fonctionnalité ou dans le processus de standardisation, un défaut pourrait survenir qui forcerait une fonctionnalité à changer.
En général, ce n'est pas une bonne idée de dépendre des fonctionnalités expérimentales. Les caractéristiques expérimentales sont exactement ce que le mot dit (c'est-à-dire expérimenter).
la source
Une personne du public a posé une question lors de la conférence «C ++ Standard Library Panel» à la CppCon 2016 ( YouTube ) sur le potentiel du nom
experimental
à dissuader les utilisateurs d'utiliser quoi que ce soit dans l'espace de noms:Michael Wong (président de SG5 et SG14 et rédacteur en chef du Concurrency TS) a répondu en premier à la question:
Alisdair Meredith (ancien président du LWG) a ensuite suivi:
Stephan T.Lavavej (responsable de l'implémentation STL de Microsoft) a été le dernier à répondre:
Il semble donc que les développeurs de bibliothèques standard et les membres du comité souhaitent que, à l’avenir du moins, le contenu de l’
std::experimental
espace de nom soit de nature véritablement «expérimentale», et il ne devrait pas être tenu pour acquis que quelque chose dansstd::experimental
sera en faire le standard C ++.Et non, pour autant que je sache, c'est aux fournisseurs de bibliothèques standard de décider s'ils fournissent des implémentations pour les différentes fonctionnalités à l'intérieur
std::experimental
.la source
«Expérimental» est un terme légèrement exagéré. La
filesystem
bibliothèque est issue de Boost et y a subi quelques itérations, avant d'être soumise à l'ISO.Cependant, les normes ISO sont intentionnellement très conservatrices. L'appeler expérimental signifie que l'ISO ne promet pas explicitement que la dénomination sera stable; il est tout à fait clair que vous devrez réadresser votre code dans le futur. Mais connaissant l'ISO, il est probable qu'il y aura 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 secondaires (pensez aux chemins relatifs aux lecteurs Windows, par exemple), et c'est exactement pourquoi une future norme pourrait casser votre code existant. Idéalement, cela casserait votre code si et seulement si vous dépendiez de ce cas d'angle, mais ce n'est pas une garantie.
la source
Quelques points à considérer:
À quel point votre projet est-il multiplateforme? S'il n'y a qu'un seul compilateur impliqué, vous pouvez inspecter son implémentation et ses antécédents pour décider. Ou demandez-leur!
Quelle est la taille de votre base de code? Quelle serait l’impact des changements?
Dans quelle mesure les fonctionnalités fournies par l'API / la bibliothèque / la fonctionnalité sont-elles fondamentales pour votre projet?
Quelles sont les alternatives?
experimental::
ou aussi difficile que de forcer des solutions de contournement.experimental
ci échouerait ou disparaîtrait.la source