Ces dernières années, on a beaucoup parlé de la « Renaissance du C++ ». Il est indéniable que Microsoft a joué un rôle significatif dans ce renouveau.
En 2011, Microsoft a annoncé le retour du C++ dans de nombreux articles, et des experts Microsoft C++ comme Herb Sutter ont donné de nombreuses conférences pour expliquer pourquoi le C++ était de retour, recommandant surtout l'utilisation du C++ moderne. Au même moment, la norme C++11 a été approuvée, et nous avons commencé à parler du C++ comme d'un nouveau langage.
En 2011, le C++ était utilisé depuis plus de 30 ans. Il n'était pas facile de convaincre les développeurs que le C++ moderne simplifiait réellement de nombreux aspects frustrants du C++ et qu'il existait une nouvelle façon moderne d'améliorer le code C++.
Pour les développeurs C++ qui ne sont pas encore passés à C++11 : vous pouvez utiliser clang-tidy pour obtenir des suggestions sur les endroits où moderniser la base de code, ou essayer la fonctionnalité de modernisation de CppDepend. Voici 15 des fonctionnalités les plus utilisées dans les bibliothèques C++ open source.
Prenons Folly, publié il y a six ans par Facebook : Folly est une grande collection de composants réutilisables de bibliothèque C++ massivement utilisés en interne chez Facebook. Voici comment son site web explique la motivation derrière sa création :
Folly (acronyme approximatif de Facebook Open Source Library) est une bibliothèque de composants C++11 conçue dans un souci de praticité et d'efficacité. Elle complète (plutôt qu'elle ne concurrence) des offres comme Boost et bien sûr std. En fait, nous ne nous lançons dans la définition de notre propre composant que lorsque quelque chose dont nous avons besoin n'est pas disponible, ou ne répond pas au profil de performance requis.Explorons 15 fonctionnalités de C++11 dans son code source :
1. auto
C++11 introduit la capacité d'inférence de type avec le mot-clé auto, ce qui signifie que le compilateur déduit le type d'une variable au point de déclaration. Folly utilise auto pour presque toutes ses déclarations de variables ; voici un exemple de son code source.

Utiliser le mot-clé auto vous fait gagner du temps en vous évitant d'écrire des choses que le compilateur connaît déjà.
2. nullptr
La constante 0 a traditionnellement servi le double rôle de constante entière et de constante de pointeur nul. C++11 corrige cela en introduisant un nouveau mot-clé pour servir de constante de pointeur nul distinguée : nullptr.
Dans le code source de Folly, tous les pointeurs nuls sont représentés par le nouveau mot-clé nullptr ; il n'y a aucun endroit où la constante 0 est utilisée.
3. shared_ptr
Les pointeurs intelligents ne sont pas un concept nouveau ; de nombreuses bibliothèques les ont implémentés il y a des années, la plus populaire étant boost::shared_ptr. Ce qui est nouveau, c'est leur normalisation — il n'est plus nécessaire d'utiliser une bibliothèque externe pour travailler avec des pointeurs intelligents.
Folly utilise massivement le pointeur partagé normalisé ; seuls quelques pointeurs bruts subsistent dans son code source.
4. Les enums fortement typées
Les enums « traditionnelles » en C++ exportent leurs énumérateurs dans la portée environnante, ce qui peut entraîner des collisions de noms si deux enums différentes dans la même portée définissent des énumérateurs portant le même nom.
C++11 introduit le mot-clé enum class. Elles n'exportent plus leurs énumérateurs dans la portée environnante. De plus, nous pouvons désormais spécifier le type sous-jacent d'une enum.

5. static assert
C++11 introduit une nouvelle façon de tester des assertions à la compilation, avec le nouveau mot-clé static_assert. Cette fonctionnalité est très utile pour ajouter des conditions aux paramètres templates, comme le montre cette classe template du code source de Folly :

6. Les templates variadiques
Un template variadique est un template qui peut prendre un nombre arbitraire d'arguments template de n'importe quel type. Les classes comme les fonctions peuvent être variadiques. Folly définit de nombreux templates variadiques ; voici deux fonctions templates variadiques du code source de Folly :

7. Les boucles for basées sur les plages
C++11 a enrichi l'instruction « for » pour prendre en charge le paradigme « foreach » d'itération sur les collections. Cela rend le code plus simple et plus propre. Folly utilise massivement cette fonctionnalité ; voici un exemple de Folly.

8. Les listes d'initialisation
En C++03, les listes d'initialisation ne s'appliquent qu'aux tableaux ; en C++11, elles ne sont plus réservées aux tableaux. Le mécanisme pour accepter une liste {}est une fonction (souvent un constructeur) acceptant un argument de type std::initializer_list<T>. Voici un exemple de fonction acceptant std::initializer_list comme argument.

Et voici comment elle est invoquée.

9. noexcept
Si une fonction ne peut pas lever d'exception ou si le programme n'est pas écrit pour gérer les exceptions levées par une fonction, cette fonction peut être déclarée noexcept.
Voici un exemple du code source de Folly.

10. move
C++11 a introduit le concept de références rvalue (spécifiées avec &&) pour différencier une référence à une lvalue d'une référence à une rvalue. Une lvalue est un objet qui a un nom, tandis qu'une rvalue est un objet qui n'a pas de nom (un objet temporaire). La sémantique de déplacement permet de modifier les rvalues.
Pour cela, C++11 introduit deux nouvelles fonctions membres spéciales : le constructeur de déplacement et l' opérateur d'affectation par déplacement.


Voici un bon document qui explique mieux les avantages de la sémantique de déplacement.
11. lambda
C++11 offre la possibilité de créer des fonctions anonymes, appelées fonctions lambda.
Folly les utilise dans de nombreuses fonctions ; voici un exemple de son code source :

12. Les fonctions membres spéciales explicitement defaultées et supprimées
En C++03, le compilateur fournit, pour les classes qui ne les définissent pas elles-mêmes, un constructeur par défaut, un constructeur de copie, un opérateur d'affectation par copie (operator=) et un destructeur. Le programmeur peut remplacer ces valeurs par défaut en définissant des versions personnalisées.
Cependant, le contrôle sur la création de ces défauts est très limité. Rendre une classe intrinsèquement non copiable, par exemple, exige de déclarer un constructeur de copie et un opérateur d'affectation par copie privés sans les définir.
En C++11, certaines fonctionnalités peuvent être explicitement désactivées. Par exemple, le type suivant est non copiable, ce qui rend le code plus simple et plus propre.

13. L'identifiant override
En C++03, il est possible de créer accidentellement une nouvelle fonction virtuelle alors qu'on voulait redéfinir une fonction de la classe de base.
L'identifiant spécial override signifie que le compilateur vérifiera la ou les classes de base pour voir s'il existe une fonction virtuelle avec exactement cette signature. Et si ce n'est pas le cas, le compilateur signalera une erreur.
Folly utilise massivement cette nouvelle fonctionnalité :

14. std::thread
Une classe thread (std::thread) est fournie, qui prend un objet fonction — et une série optionnelle d'arguments à lui passer — à exécuter dans le nouveau thread.
En C++11, travailler avec les threads est plus simple ; voici la nouvelle façon standard de définir un nouveau thread, tirée du code source de Folly :

15. Les conteneurs non ordonnés
Un conteneur non ordonné est une sorte de table de hachage. C++11 en propose quatre standard :
- unordered_map
- unordered_set
- unordered_multimap
- unordered_multiset
Folly utilise ces nouveaux conteneurs à de nombreux endroits.

