L’arrivée du C++17 – Présentation générale

Le C++17 est arrive cette année, avec son lot de fonctionnalités pour le langage et la bibliothèque standard. Cette série d’article va présenter certains changement du C++17 et tenter de donner des exemples d’utilisation et de préciser un maximum le but de ces modification du langage.

Dans cet article, je vous propose un petit rappel concernant le processus de standardisation du C++ ainsi que l’état actuel du standard et les fonctionnalités à venir.

La série “L’arrivée du C++17”

Voici la liste des articles de la série :

La standardisation du C++

Le C++ n’est pas un langage propriétaire et n’est pas développé ou soutenu par une entité privée particulière, comme le Java (Oracle) ou le C# (Microsoft) par exemple.

Un grand nombre d’acteurs différents participe à son développement, entreprises, organisations ou développeurs indépendants, aux travers de discussions telles que le Google Group std-proposals par exemple permettent de faire avancer le langage.

La standardisation est assurée par l’International Organization for Standardization (ISO) au travers du Working Group 21 (WG21) fondé au début des années 90 et qui travaille à l’évolution du langage et la bibliothèque standard. Les brouillons (drafts) sont disponibles gratuitement ainsi que toutes les publications et discussions à ce sujet, le standard officiel est quant à lui payant (environ 120€), mais est destiné aux créateurs de compilateurs.

Le WG21 se décompose en plusieurs groupes de travail, chacun ayant un champs d’action défini.

Parmi le comité de standardisation, on compte notamment le président Herb Sutter (Microsoft), le “project-editor” Richard Smith (Google) et le secrétaire Jonathan Wakely (Red Hat).

Structure du WG21

Il comporte quatre Working Groups (WG) :

  • Core (CWG), dirigé par Mike Miller (Edison Design Group).
  • Evolution (EWG), dirigé par Ville Voutilain (The Qt Compagny).
  • Library (LWG), dirigé par Marshall Clow (Qualcomm).
  • Library Evolution (LEWG), dirigé par Jeffrey Yasskin (Google).

Les deux groupes CWG et LWG se chargent de maintenir le langage existant et de l’adapter aux nouvelles évolutions tandis que EWG et LEWG sont responsable des évolution du langage et de la bibliothèque standard.

Ces WG sont complétés par quinze Study Groups (SG) qui travaillent sur des domaines plus spécifiques. Consultez la page du comité pour plus de détails sur l’organisation du WG21.

Le processus inclut aussi les Technical Specifications (TS) qui permettent une plus grande souplesse dans la normalisation du C++. L’idée étant de proposer des spécifications de fonctionnalités qui sont encore en cours de discussion et qui ne sont pas encore intégrés à la norme (mais qui sont déjà à un stade avancé de développement), de manière à ce que les compilateurs puissent proposer en avance ces améliorations à venir. Les concepts (Concepts TS), publiés en 2015, sont par exemple déjà disponibles sous GCC. Dans ce cas, les modifications au niveau de la bibliothèque standard sont disponibles dans l’espace de noms  std::experimental::  et les headers sont distribués dans le sous-dossier experimental/. Cppreference.com maintient une page listant les fonctionnalités expérimentales du langage.

L’état actuel du standard

Le C++17 est la cinquième version du standard C++ :

  • ISO/IEX 14882:1998 (C++98).
  • ISO/IEX 14882:2003 (C++03).
  • ISO/IEX 14882:2011 (C++11), aussi connu sous le nom C++0x (puisqu’il devait à l’origine sortir avant 2010).
  • ISO/IEX 14882:2014 (C++14), aussi appelé C++0y.
  • ISO/IEX 14882:2017 (C++17), aussi nommé C++1z.

C++11 a été une mise à jour majeure du langage, proposant des nouveautés importantes comme la sémantique de mouvement, un type system unifié, la syntaxe d’initialisation uniforme, l’inférence de types ( auto , decltype), constexpr, nullptr, les énumérations fortement typées… Il a été complété par la mise à jour mineure C++14.

C++17 était prévu pour être une révision majeure également. S’il ajoute effectivement beaucoup d’éléments au langage et la bibliothèque standard, des fonctionnalités ont été repoussées comme par exemple les concepts, les modules, les ranges. Il n’est pas aussi révolutionnaire qu’on aurait pu le souhaiter.

Que propose donc le C++17 ?  Cette réponse sur stackoverflow.com donne des liens pour pratiquement tous les ajouts de cette révision. La série d’articles qui va suivre tente d’expliquer et de donner des exemples pour ces changements, qui incluent notamment la copy elision “garantie”, std::variant , std::any, std::optional, std::string_view, de nouveaux algorithmes, le filesystem…

Concernant la suite, le C++20 est prévu pour 2020 (comme son nom l’indique si bien). Le diagramme suivant montre la feuille de route du comité et les statuts des principales fonctionnalités à venir.

Feuille de route du WG21
Feuille de route du WG21

Parmi les nouveautés à venir pour le C++20 et plus, on peut notamment compter :

  • Modules : le mécanisme visant à remplacer le système d’inclusion de headers actuel.
  • Concepts : un système de prédicats sur les types paramétrés permettant une compilation accélérée et la simplification des messages d’erreur lors de l’utilisation des templates.
  • Range : cette partie de la bibliothèque propose une implémentation des ranges faisant un usage intensif des concepts et qui propose des fonctionnalités interessantes, telles que les listes de compréhension ou les vues immuables.
  • Coroutines : déjà présent dans certains langages généraux ( yield  en C#), les coroutines permettent d’avoir des fonctions possédant plusieurs points d’entrée et donc la reprise d’une fonction à un endroit précis. Certaines bibliothèques proposaient déjà les coroutines (comme Boost.Coroutines ou CO2 par exemple).
  • La réflexion statique : incluant la réflexion, l’injection et la méta-programmation (avec les meta-classes), la conférence de Herb Sutter sur le “generative C++” à la CppCon2017 explique très bien l’idée et l’utilité de cette nouvelle partie du langage.
%d bloggers like this: