C++17 en images

Copyright 2017 olibre   CC BY-SA 4.0

le logo C++FRUG est consitué du drapeau de la francophonie avec C++ au centre

C’était mieux avant ?

Évolution du langage C++

C++ a une quarantaine d’années

C++17 c’est un gros pavé

Deux collègues contents de la sortie de C++17 mais qui ils ne sont pas au courant des Meetups C++FRUG qui leur permettrait de cerner les nouvelles fonctionnalités.

C++17 ajoute 254 pages

Date ISO/IEC ou Draft Pages
1998-09-01 C++98 14882:1998 776 pages
2003-10-15 C++03 14882:2003 786 pages (+ 1%)
2011-09-01 C++11 14882:2011 1356 pages (+73%)
2012-02-28 C++11 N3376 1324 pages
2014-11-19 C++14 N4296 1368 pages (+ 3%)
2017-03-21 C++17 N4659 1622 pages (+19%)

2016 : Deux réunions pour figer le périmètre du C++17

Photo prise à Oulu par Loïc Joly à 23h.

Oulu à 23h

La nuit à 1h à Tromsø à 600 km de Oulu en juin

Le soleil n'est pas encore couché à une heure du matin dans la ville de Tromsø à 600 km de Oulu

Les Concepts et Reflexion étaient très attendues

Deux chatons tristes que Concepts et Reflexion n'aient pas été intégrées à C++17

2003 - Bjarne Stroustrup présente les Concepts au comité C++

Bjarne et les Concepts en 2003

Quoi ! Pas pour C++03 ?
Bon Okey, C++03 n’est qu’une version mineure…

2011 - Les Concepts

Bjarne et les Concepts en 2011

Quoi ! Pas pour C++11 ?
Bon Okey, faut bien arrêter de repousser C++0x…

2014 - Les Concepts

Bjarne et les Concepts en 2014

Quoi ! Pas pour C++14 ?
Bon Okey, C++14 n’est qu’une version mineure…

2017 - Les Concepts

Bjarne et les Concepts en 2017

Quoi ! Pas pour C++17 ?
Bon Okey, mais on arrête les versions mineures…

De très nombreuses décénies plus tard, les Concepts sont enfin intégrés

Bjarne et les Concepts en 20xx

Ce n’est pas trop tôt !

Un air de promesses électorales

C++17 président

C++17

dépoussière le standard C++

The C++ Programming Language de Bjarne Stroustrup

logo "The C++ Programming Language"

Quatrième édition publiée en 2013
à la page 1046 du paragraphe
36.3.6 STL‐like Operations

The replace() replaces one substring with another and adjusts the string’s size accordingly. For example:

void f()
{
 string s = "but I have heard it works even if you don't believe in it";
 s.replace(0,4,"");                   // erase initial "but "
 s.replace(s.find("even"),4,"only");
 s.replace(s.find(" don't"),6,"");    // erase by replacing with ""
 assert(s=="I have heard it works only if you believe in it");
}

A replace() returns a reference to the object for which it was called. This can be used for chaining operations:

void f2()
{
 string s = "but I have heard it works even if you don't believe in it";
 s.replace(0,4,"").replace(s.find("even"),4,"only").replace(s.find(" don't"),6,"");
 assert(s=="I have heard it works only if you believe in it");
}

On modifie le C++ pour corriger le livre de Bjarn

Virgule flottante en hexadécimal

P0245 officialise les hexadecimal floating literals (comme pour C99, Java 5 2004)

float  v = 0x'Baffe.bobo'p1f;
double w = 0x'C0DE'2017'1.cafe'p1;

Les Nerdettes s’entraînent pour le concours des littéraux hexadécimaux sur LinuxFr.org

Variable inline (P0386)

Les deux filles nerds résolvent une erreur de link d'une variable membre static non définie en rajoutant inline

auto x{42}; déduit comme int x{42};

N3922 comble un trou dans les règles de déduction pour auto à partir des {listes d’initialisation}

auto a   {1};      //OK => int a{1};
auto b = {1};      //OK => std::initializer_list<int> b = {1};
    
auto c   {1, 2};   //KO car plus d'un élément
auto d = {1, 2};   //OK => std::initializer_list<int> d = {1, 2};
    
auto e   {1, 2.0}; //KO car plus d'un élément
auto f = {1, 2.0}; //KO car pas le même type (int et double)

Une écolière écrit une boucle for en C++17 pour régler sa punition d'écrire 100 fois "Je ne dois pas envoyer d'avion en papier"

Apple ][ (1977-1988)

Ou sont les accolade et crochet ?

Image du clavier de l'Apple II qui n'a pas de touche avec accolade ou crochet

BBC Master (1986-1994)

Ah les crochets, mais pas les accolades ?

Clavier intégré du micro-ordinateur BBC Master de Acorn

/??/
/??/ Avec trigraphes
??=include <iostream>
int main (int argc, char *argv??(??)) ??< 
  const char txt??(??) = "J'aime le C++17??/0";
  std::cout << txt << std::endl;
??>
/\
/\ Sans trigraphe
#include <iostream>
int main (int argc, char *argv[]) {
  const char txt[] = "J'aime le C++17";
  std::cout << txt << std::endl;
}

Suppression des trigraphes

C++11 : Trigraphes prévus pour être obsolètes.
Mais des membres du comité se sont opposés.

C++17 - N4086 les supprime
sans passer par l’étape deprecated.

N3928 permet static_assert(condition)
sans le second paramètre message.

// Les static_assert avec un message vide étaient courants
static_assert(sizeof(int) == 4, "");

// C++17 a été influencé par l'usage (mauvaise pratique ?)
static_assert(sizeof(int) == 4);

Devinette

À quels aspects C++17

la prochaine image fait référence ?

Les fonctions empty, data() et size() sortent de la prison "class" et rejoignent les fonctions begin() et end() qui les accueillent. Ces deux dernières fonctions accueillent également string_view. Derrières les barreaux de la prison des spécifications techniques, Unified-Call-Syntax va devoir y rester trois ans pour tenter de sortir avec C++20

Les prochains sujets ?

Singletons

Ce n’est pas si évident que cela

Et ce n’est pas toujours pertinent

P0135

Simplification de la taxonomie

et conséquence sur la copie elision

lvalue xvalue rvalue prvalue glvalue

Convertir un enum en string et inversement

CMake

Astuces et C++

Controverses

Loïc se propose de partager les débats pour lesquels les membres du comité C++ ne sont pas sûrs d’aller dans la bonne direction.

La parole est à la communauté C++FRUG.