Passer au c++ moderne – Billet 1

Voici le premier billet d’une petite série qui va explorer quelques possibilités de la prochaine version du langage.
 
Cette version qui devrait être finalisée cette année nous apporte un lot de nouvelles fonctionnalités très utiles:
  • Generic lambdas
  • Lambda captures expressions
  • Function return type deduction
  • Alternate type deduction on declaration
  • Relaxed constexpr restrictions
  • Variable templates
  • Aggregate member initialization
  • Binary literals

Le langage se dote de fonctions modernes qui simplifient l’écriture du code et le rende plus flexible, avec par exemple l’utilisation des ‘auto’ déductions du type de retour des fonctions.

 
D’autres ajouts notables étendent les possibilités du c++ de manière significative:
  • Shared mutexes and locking
  • Standard user-defined literals

Ce petit billet explique la mise en œuvre pour accéder a ces fonctionnalités sur une machine Ubuntu récente (version 14.04).

Pour l’heure, certaines fonctions du c++1y ne sont pas encore implémentées parmi les différents compilateurs, mais une grande partie est utilisable.
 
Il faut tout d’abord installer une version récente du compilateur sur la machine.
Pour GCC,
sudo add-apt-repository ppa:ubuntu-toolchain-r/test
sudo apt-get update
sudo apt-get install g++-4.9

Pour Clang, la version 3.4 ou 3.5 fera l’affaire:

sudo apt-get install clang-3.4 ou sudo apt-get install clang-3.5
 
Ensuite il vous suffit de compiler votre programme avec le compilateur de votre choix sans oublier « -std=c++1y » dans la chaîne de compilation.
 
Et pour finir, un petit example pour tester, que la compilation en c++1y fonctionne :
 
#include <iostream>
#include <memory>

struct Naio
{
    uint32_t robot_count_;
    uint32_t employee_count_;
    uint64_t employee_happiness_level_;
};
 
int main()
{
    std::unique_ptr<Naio> naio = std::make_unique<Naio>();
}

g++ -std=c++11 -c example.cpp

Note: la compatibilité entre clang et la librairie standard stdc++ à été mise a mal lors de l’arrivée de la version 4.9 de la librairie standard.
Un patch a depuis été publié, mais il n’a pour le moment pas fait son apparition sur Ubuntu. Il est donc possible d’utiliser l’alternative a la librairie standard std libc++ (libcxx.llvm.org)
qui fonctionne très bien de pair avec clang.
Dans ce cas ci, on se doit de spécifier quelle librairie standard on utilise dans la chaîne de compilation: clang++ -std=c++1y -stdlib=libc++ example.cpp
Jean