mercredi 21 juin 2017

C++11 - Qu'apporte cette nouvelle norme du Langage en 2011 ?

Standard for programming language C++ approved by International Organization for Standardization (ISO) on 12 August 2011, replacing C++03,[1] superseded by C++14 on 18 August 2014[2] and later, by C++17, which is still under development.

C++11, introduit le mot-clef thread_local pour déclarer qu'une variable doit être stockée dans une zone mémoire appartenant au thread.

- Modificateur volatile

- Délégation du constructeur
En C++11 un constructeur de classe peut appeler un autre constructeur de cette même classe se qui simplifie le code.

- Héritage du constructeur

- Les Templates

- Les Templates variadiques
comme les fonctions variadiques du C (avec un nombres d'arguments non connu à l'aide de va_list et aux macros va_start(), va_arg() et va_end() de <stdarg.h>)
exemple : la classe tuple

- Assertions statiques
static_assert(sizeof(long) > sizeof(int));
permettrait à une bibliothèque d'être certaine qu'elle est compilée sur un système vérifiant cette condition (x86-64 par exemple).

- Inférence de types
le mot clef auto se voit assigner une nouvelle sémantique
- avant : variable auto : valide seulement dans l'espace où elle est déclarée (comme c'est le comportement par défaut ce mot clef était inutile)
- maintenant une variable déclarée de type auto doit impérativement être initialisée
exemple:
auto f = boost::bind(MyFunc, _1);
f(5);
trouver le type d'objet du résultat d'un bind n'est pas facile d'ou le type auto

decltype permet de typer une variable à partir du type d'une autre variable
Exemple :
int i;
decltype(i) j = 5;


- Sémantique move()

En C++, il n'y a aucun moyen de déplacer un objet sans le copier. Ainsi la fonction swap :

template <class T>
void swap ( T& a, T& b )
{
  T c(a);
  a=b;
  b=c;
}

Appelle d'abord le constructeur de recopie puis deux assignations c'est donc trois copies au total.
C++11 introduit la fonctions std::move() dont le patron est le suivant :

template <class T>
typename remove_reference<T>::type&&
move(T&& a)
{
    return a;
}

L'objet d'origine peut être modifier à partir du résultat de la fonction move() et swap peut être réécrite de façon plus concise :

template <class T>
swap(T& a, T& b)
{
    T tmp(std::move(a));
    a = std::move(b);
    b = std::move(tmp);
}

- Énumérations fortement typées

- Pointeur NULL
en C : #define NULL ((void*)0) est impossible en C++ ne peut pas servir pour un pointeur de type différent de void*
création de nullptr qui a la particularité de pouvoir être assigné à tous types de pointeurs. On pourra écrire :

T* ptr = nullptr;

- Threads
implémentation de la bibliothèque boost.

- Type Tuple
Collection de dimensions fixe d'objets de types différents

https://fr.wikipedia.org/wiki/C%2B%2B11

C++14

On dit souvent du C++14 que c'est avant tout la correction des beugs du C++11. Mais il y a aussi des nouveautés.

- Littéraux binaires préfixe 0b ou 0B
int nb = 0b11;
std::cout << nb << std::endl; // sortie de l'application : 3

- Séparateurs de chiffres 
Pour facilité la lecture :
int un_milliard = 1'000'000'000;

https://fr.wikipedia.org/wiki/C%2B%2B14

Pour aller plus loin de bons exemples avec :

Zeste de savoir - Le C++14 est arrivé

 

Aucun commentaire:

Enregistrer un commentaire