- Plein de nettoyages et d'améliorations appréciables au niveau du langage, mais pas le boulversement attendu des fonctionnalités Concept, Import, Réflexion...
- De gros pavés du côté de la bibliothèque standard, mais souvent déjà disponibles avec boost
Face à la déception de cette version pas très majeure, le comité réfléchit à faciliter la contribution de la communauté C++ et à fuidifier le processus de standardisation.
C'est la fin de l'alternance de versions majeurs/mineures : Toutes fonctionnalités prêtes l'année N-1 seront intégrées dans le standard pour l'année N, qu'elles soient majeurs ou mineures.
Les différentes fonctionnalités du C++17 commencent à être implémentées par les principaux compilateurs. Souvent les fonctionnalités sont annoncées comme implémentées, malgré la présence de bugs ou de limitations. Voici une anecdote à ce sujet :
Date | Événement |
---|---|
Mai 2013 | GCC-4.8.1 est annoncé comme le premier compilateur C++11. |
Janvier 2014 | Clang-3.4 est annoncé comme le premier compilateur C++14. |
Avril 2015 | GCC-5.1 est annoncé comme implémentant toutes les fonctionnalités C++14. |
Mai 2016 | La bibliothèque boost::hana est enfin intégrée à boost car au moins deux compilateurs supportent les fonctionnalités C++14 utilisées par cette bibliothèque : Clang-3.5 et GCC-6. Donc, les versions précédentes Clang-3.4 et GCC-5.1 ne supportaient pas tout à fait C++14 ! |
Été 2017 | C'est peut-être au tour de Visual C++ d'être le premier compilateur C++17... |
Il n'existe pas vraiment encore de test de conformité du support des fonctionnalités de telle ou telle version du C++ (pas d'équivalent aux Acid3, Sputnik des technologies du web).
Par contre, on peut trouver des tables de compatibilité sur le support des différentes fonctionnalités C++ :
- sur cppreference ;
- sur le site officiel GCC ;
- sur le site officiel Clang et sa libcxx ;
- sur le blog Visual C++ (version en anglais).
Changement important des nouvelles versions C++ : un compilateur n'est plus obligé d'implémenter toutes les fonctionnalités C++17 pour être annoncé comme supportant C++17.
Par exemple, un éditeur pourrait vendre un compilateur supportant tout le C++17 sauf "attribute specifier sequence" qu'il juge fastidieux et inutiles pour ses clients/prospects. Cet éditeur peut annoncer que son compilateur est conforme au C++17 excepté ces "attributs".
Donc, le support des fonctionnalités C++ est à la carte. Au lieu de devoir attendre un compilateur supportant toutes les fonctionnalités C++17 pour enfin coder en C++17, il est possible de coder dès maintenant en C++17 sur telle ou telle fonctionnalité C++17.
Par exemple, GCC-6 permet de profiter en avance des Concepts et de la Transactional Memory (encore plus en avance que C++17). Et Clang-3.5 implémente un support expérimental des Modules C++ (support amélioré avec les versions suivantes).
En conclusion, pas la peine d'attendre la sortie du standard C++17 (ou des versions suivantes) pour utiliser les nouvelles fonctionnalités déjà supportées par nos compilateurs.
Attention, la macro __cplusplus
n'indique pas la version C++ supportée par le compilateur. Mais indique la version C++ activée par les options de compilation. Pour information, GCC avant 4.7 a __cplusplus
qui vaut 1
au lieu de 199711
.
#ifdef __cplusplus
# if __cplusplus <= 199711 //Bug GCC < 4.7
# warning Compilé pour C++99
# elif __cplusplus == 201103
# warning Compilé pour C++11 //-std=c++0x
# elif __cplusplus == 201402 //par défaut GCC6
# warning Compilé pour C++14 //-std=c++1y
# elif __cplusplus > 201700
# warning Compilé pour C++17 //-std=c++1z
# else
# error Valeur inattendue de __cplusplus
# endif
#else
# warning __cplusplus non défini
#endif
Deux alternatives pour vérifier le support des fonctionnalités C++ :
- les macros Boost.Config ;
- les macros de test des fonctionnalités C++.
Cette seconde série de macros est plus élégante, mais nécessite un compilateur récent. Voici un exemple d'utilisation :
#ifdef __cpp_experimental_concepts
template<typename T>
bool pareil (T&& a, T&& b) requires EqualityComparable<T>
{ return a == b; }
#else
template<typename T>
bool pareil (const T& a, const T& b)
{ return a == b; }
#endif
#ifdef __cpp_lib_experimental_filesystem
# include <filesystem>
void archiver()
{ std::filesystem::copy("fichier.txt","archive.txt"); }
#else
void archiver()
{ /* ... */ }
#endif
Ah ! On me signale que GCC aurait implémenté __cpp_concepts
, que les documents du comité de standardisation C++ parlent plutôt de __cpp_concepts
et de __cpp_lib_filesystem
, et la partie _experimental
sera de toute façon retirée dans quelques années...
Vérifions donc avec et sans _experimental
:
#define SUPPORT_LANG(f) (defined(__cpp_experimental_##f) || defined(__cpp_##f))
#define SUPPORT_LIB(f) (defined(__cpp_lib_experimental_##f) || defined(__cpp_lib_##f))
#if SUPPORT_LANG(concepts)
template<typename T>
bool pareil (T&& a, T&& b) requires EqualityComparable<T>
{ return a == b; }
#else
// ...
#endif
#if SUPPORT_LIB(filesystem)
// ...
#else
// ...
#endif
Pour aller plus loin, tester aussi la valeur (année mois) des macros __cpp_concepts
et __cpp_lib_filesystem
(du style 201501
).
Pour indiquer les fonctionnalités C++ utilisées par son code avec CMake :
# CMake-3.1 a introduit target_compile_features()
cmake_minimum_required(VERSION 3.1)
add_library(MaLib malib/src/lib.cpp
malib/include/malib/lib.h)
target_include_directories(MaLib PUBLIC malib/include)
# lib.cpp utilise le constexpr du C++11
target_compile_features(MaLib PRIVATE cxx_constexpr)
# L'en-tête publique utilise [[deprecated]] (C++14)
target_compile_features(MaLib PUBLIC cxx_attribute_deprecated)
# L'application utilise le decltype du C++11
add_executable(MonApp src/main.cpp)
target_compile_features(MonApp PRIVATE cxx_decltype)
target_link_libraries(MonApp MaLib)
Et toi, cher lecteur/chère lectrice de LinuxFr.org, es-tu content(e) de la disponibilité rapide des fonctionnalités des prochaines versions C++ ? Et quand penses-tu que tu pourras utiliser ces nouvelles fonctionnalités C++ dans ton travail ? Subis-tu l'interdiction d'utiliser C++17 ? (à cause de règles de codage figées ou de l'obligation de rester sur un vieux compilateur ?) Et dans tes loisirs, dans combien de temps penses-tu passer au C++17 ?
TODO
http://ldionne.com/meetingcpp-2016/#/18
D'ici la standardisation finale C++17, le comité va s’efforcer de corriger les incohérences et les zones floues. Toute la communauté C++ est donc invitée à participer via les dépôts Git du comité de standardisation ISO C++, notamment sur le dépôt "draft" (ébauche).
CppReference a aussi besoin de vous comme nous le disait nazcafan en 2012. D'autant plus, qu'au moment de la rédaction de cette dépêche, les pages anglaises C++17 sont incomplètes ou inexistantes, et c'est pire du côté des pages françaises !
Comme indiqué dans l’introduction, chacun peut faire profiter les autres de ses propres recherches C++17 en enrichissant cette présentation sur le dépôt Git "materials" C++FRUG (les personnes intéressées peuvent indiquer dans les commentaires son pseudo GitHub). Ainsi nous pourrons partager un contenu libre CC-BY-SA pour :
- Ajouter un article Wikipédia C++17 en français ;
- Organiser des conférences (Meetup) ;
- Publier un billet sur tout autre site ;
- ...