- 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.
- 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
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é
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