Introduction au C++11/17
Introduction au C++11/17
Contact : [Link]@[Link]
Mars 2024
Journée 1 Chiheb Ameur ABID 2/ 68
Historique et évolution du langage C++
Plan
2 Littéraux
ID
r AB
3 Les espaces de noms Chiheb Ameur u
e ABID
b Am
ih e
4 Ch
Les nouveautés du langage C++11/C++17
5 Références et expressions
6 Les attributs
Journée 1 Chiheb Ameur ABID 3/ 68
Historique et évolution du langage C++
Historique
å En 1970, Ken Thompson, créa un nouveau langage : Le B
Z Simple, mais trop dépendant de l’architecture utilisée
å En 1971, Dennis Ritchie commence à mettre au pointIDle successeur du B, le C.
Z Portable, r AB
Chiheb (peut
Ameuru
e ABID
Z Langage bas niveau : performant
b Am créer du code aussi rapide que de
l’assembleur) ih e
Ch de haut niveau
Z Permet de traiter des problèmes
å En 1989, l’ANSI (American National Standards Institute) normalisa le C sous les
dénominations ANSI C ou C89
Journée 1 Chiheb Ameur ABID 5/ 68
Historique et évolution du langage C++
Historique
å En 1983, Bjarne Stroustrup des laboratoires Bell crée le C++
Z Basé sur le C, il garde une forte compatibilité avec le C
å La première normalisation de C++ date de 1998 (C++98)
ID
r AB
Chiheb Ameur u
e ABID
b Am
ih e
Ch
Journée 1 Chiheb Ameur ABID 6/ 68
Historique et évolution du langage C++
Évolution de C++
Évolution de C++
ID
r AB
Chiheb Ameur u
e ABID
b Am
ih e
Ch
Journée 1 Chiheb Ameur ABID 7/ 68
Historique et évolution du langage C++
Compilation
Compilation
Compilateur GCC
å GCC est un logiciel libre capable de compiler divers langages de programmation, dont C,
C++, Objective-C, Java, Ada et Fortran BID
rA
u de chaque langage
å Pour faire référence précisément
Chiheb me ABID
aux compilateurs
Ameur
A
gcc : le compilateur C de GNU b
ihe
g++ : le compilateur C++ de GNU Ch
gcj : le compilateur Java de GNU
gobjc : le compilateur Objective-C de GNU
gobjc++ : le compilateur Objective-C++ de GNU
gnat : le compilateur Ada de GNU
gfortran : le compilateur Fortran de GNU
Journée 1 Chiheb Ameur ABID 9/ 68
Historique et évolution du langage C++
Compilation
Compilateur GCC
å Installer GCC
ID
AB
$ sudo apt-get install build-essential
å Compiler un programme Chiheb Ameur ur
e ABID
b Am
Z Programme écrit C ih e
Ch
$ gcc main.c fonctions.c -o Programme
Z Programme écrit en C++
$ g++ [Link] [Link] -o Programme -std=c++17
å Pour le lancer le programme
$ ./Programme
Journée 1 Chiheb Ameur ABID 10/ 68
Historique et évolution du langage C++
Compilation
Toolchain
Un toolchain est constitué par un ensemble
d’outils permettant de produire le fichier
exécutable
å C++ Preprocessor : Inclure le contenu des
fichiers entêtes (headers), générer les ID
r AB
macros et remplacer les constantes
Chiheb Ameur u
e ABID
définies par #define
b Am
g++ −E [Link] ih e
å Compiler : Traduire en assembleur
Ch
g++ −S [Link]
å Assembler : produire fichier objet binaire
en traduisant les instruction assembleur en
langage machine (binaire)
g++ −c [Link]
å Linker : édition des liens du fichier objet
avec les autres fichiers objets de n’importe
quelle bibliothèque utilisée afin de
produire le fichier exécutable
Journée 1 Chiheb Ameur ABID 11/ 68
Littéraux
Plan
2 Littéraux
ID
r AB
3 Les espaces de noms Chiheb Ameur u
e ABID
b Am
ih e
4 Ch
Les nouveautés du langage C++11/C++17
5 Références et expressions
6 Les attributs
Journée 1 Chiheb Ameur ABID 12/ 68
Littéraux
Les littéraux
Présentation
å Un littéral (aussi appelé constante littérale) est une valeur écrite exactement comme elle
doit être interprétée. D
I
å Exemples de littéraux r AB
Chiheb Ameur u
e ABID
1 "Bonjour, le monde"
b Am
2 "Bjarne"
ih e
3 ’a’ // Caractère minuscule a Ch
4 ’A’ // Caractère majuscule A
5 123
6 123U // Entier non signé 123
7 1’000’000 // Entier séparé par des apostrophes pour la lisibilité
8 3.1415 // Nombre décimal
9 1.0L // Nombre décimal avec suffixe L indiquant un long
10 1.23456789e-10 // Nombre scientifique
Journée 1 Chiheb Ameur ABID 13/ 68
Littéraux
Littéraux de caractère
Littéraux de caractère
å En C++03
std::cout << "printf(\"Hello, %s%c\\n\", \"World\", ’!’);"<<std::endl;
å En C++11
std::cout << R"(printf("Hello, %s%c\n", "World", ’!’);)" <<std::endl;
Journée 1 Chiheb Ameur ABID 15/ 68
Littéraux
ID
AB
1 namespace compunits
2 {
u r
e ABID
Chiheb Ameur
constexpr size_t operator "" _KB(unsigned long long const size)
Am
3
4 {
e b
5
ih
return static_cast<size_t>(size * 1024);
6 } Ch
7 }
8
9 auto size{ 4_KB }; // size_t size = 4096;
10 using byte = unsigned char;
11 auto buffer {std::array<byte, 1_KB>{}};
Journée 1 Chiheb Ameur ABID 18/ 68
Les espaces de noms
Plan
2 Littéraux
ID
r AB
3 Les espaces de noms Chiheb Ameur u
e ABID
b Am
ih e
4 Ch
Les nouveautés du langage C++11/C++17
5 Références et expressions
6 Les attributs
Journée 1 Chiheb Ameur ABID 19/ 68
Les espaces de noms
Espace de noms
Présentation
å Un espace de noms est une région qui fournit une portée aux identificateurs déclarés à
l’intérieur
Z Les espaces de noms fournissent un mécanisme pour réduire le risque de conflits de
ID
noms AB
ur
å Syntaxe Chiheb Ameur
A me ABID
b
1 namespace nom { ihe
2 // Corps de l’espace de Ch(code)
noms
3 ...
4 }
Espace de noms
Utilisations
å Utilisation de différents modules et bibliothèques dans un programme
Z Problème dit de ń pollution de l’espace de noms ż : Un même identificateur peut être
utilisé par plusieurs modules ou bibliothèquesBI
D
r A
Z Risque d’ambiguité
Chiheb Ameur e
ABID u
b Am
ih e
Exemple d’espace de noms Ch
å Donner un nom à un espace de déclaration
1 namespace mon_module {
2 //declarations usuelles
3 extern double taux;
4 double conversion(double);
5 }
Journée 1 Chiheb Ameur ABID 21/ 68
Les espaces de noms
Espace de noms
å L’espace des déclarations globales d’un programme est aussi un espace de noms dit portée
globale
Z ::x fait référence à l’identificateur x de la portée globale
Journée 1 Chiheb Ameur ABID 22/ 68
Les espaces de noms
Espace de noms
e b
Z ih
Ch portée globale alors ::taux et
Si on fait entrer taux dans la
mon_module::taux deviennent des écritures équivalentes
Z Attention : il ne doit pas y avoir d’autre taux dans la portée courante
å La directive using permet de rendre visibles les noms définis dans un espace de noms
1 using namespace mon_module;
2 std::cout << conversion(3);
Journée 1 Chiheb Ameur ABID 23/ 68
Les espaces de noms
Espace de noms
å Le compilateur signale
Z Les ambigüités entre identifiants des espaces de noms rendus visibles
Z Mais pas les surcharges de fonctions à travers les espaces de noms !
å Il est parfois plus prudent d’utiliser une déclaration using qu’une directive using !
Journée 1 Chiheb Ameur ABID 24/ 68
Les espaces de noms
Espace de noms
Espace de noms
Espace de noms
Plan
2 Littéraux
ID
r AB
3 Les espaces de noms Chiheb Ameur u
e ABID
b Am
ih e
4 Ch
Les nouveautés du langage C++11/C++17
5 Références et expressions
6 Les attributs
Journée 1 Chiheb Ameur ABID 29/ 68
Les nouveautés du langage C++11/C++17
La constante nullptr
Présentation
å Les expressions constexpr ont été introduites en C++11
ID
å constexpr AB
Chihebdont
¶ Déclarer une variable constante lae
Ameur ur ABID
valeur est connue lors de la compilation
b Amune valeur constante à la compilation si ses
· Définir une fonction qui peut produire
e
hih
arguments sont des valeursCconstantes
å L’objectif est de réaliser des calculs pendant la compilation
å En C++, la méta-programmation se base sur les templates méta-fonctions et les fonctions
constexpr
Z Écrire du code qui sera interprété non pas à l’exécution, mais pendant la compilation
Journée 1 Chiheb Ameur ABID 31/ 68
Les nouveautés du langage C++11/C++17
constexpr
constexpr
constexpr
Initialisation uniforme
Initialisation uniforme
å Fonctionnalité introduite avec le standard C++11
å Utiliser une syntaxe cohérente pour initialiser des variables et des objets, allant des types
ID
primitifs aux agrégats
r AB
Z Éviter certaines ambiguïtés u
Chiheb me ABID
syntaxiques
Ameur
Z Prévenir les conversions implicitesbA
he
i
Ch {}
å Basée sur l’utilisation des accolades
type var_name{arg1, arg2, ....arg n}
Initialisation uniforme
Initialisation uniforme
å Initialisation des types primitifs
Z Légèrement plus sûre pour les conversions étroites
1 int count1(7.5); // Peut compiler sans avertissement
ID
2
r AB
int count2 = 5.3; // Peut compiler sans avertissement
3 u
e ABID
int count3{0.3}; // Au moins un avertissement, souvent une erreur
Chiheb Ameur
b Am
å Initialisation par valeur ih e
Ch
Z Initialise à 0 les types primitifs
Z Fait appel au constructeur par défaut pour les classes
1 int x; // Valeur quelconque
2 int i{}; // i prend 0
Initialisation uniforme
Initialisation uniforme
å Initialisation des agrégats
Z Tableaux
1 int arr[] { 1, 2, 3, 4 };
ID
2
r AB
float numbers[] = { 0.1f, 1.1f, 2.2f, 3.f, 4.f, 5. };
3
Chiheb Ameur u
int nums[10] { 1 }; // 1, puis des 0s
e ABID
Z Structures b Am
ih e
1 struct CarInfo { Ch
2 std::string name;
3 unsigned year;
4 unsigned seats;
5 double power;
6 };
7 CarInfo any; // Des valeurs aléatoires pour les membres de types primitifs
8 CarInfo empty{}; // 0 pour les membres de types primitifs
9 CarInfo firstCar{"Megane", 2003, 5, 116 };
10 CarInfo partial{"unknown"}; // Les autres champs prennent la valeur 0
11 CarInfo largeCar{"large car", 1975, 10};
Journée 1 Chiheb Ameur ABID 38/ 68
Les nouveautés du langage C++11/C++17
Initialisation uniforme
Initialisation uniforme
å Initialiser les objets
ID
Type objet {...};
r AB
Chiheb Ameur u
e ABID
å Am l’ordre suivant :
L’initialisation d’un objet est effectuéebselon
ih e
Ch
¶ Les constructeurs à liste d’initialisation utilisant un paramètre de type
std::initializer_list<T>
· Les autres constructeurs
¸ L’affectation directe des membres : n’est autorisée que pour les tableaux et les classes
si toutes les variables (non statiques) sont publiques et que la classe n’a pas de
constructeur défini par l’utilisateur
Journée 1 Chiheb Ameur ABID 39/ 68
Les nouveautés du langage C++11/C++17
Initialisation uniforme
1 struct Box { };
2 struct Product {
ID
AB
3 Product(): name{"default product"} { }
4 Product(const Box& b) : name{"box"}{ }
u r
e ABID
Chiheb Ameur
Am
5 std::string name;
6 };
e b
7 ih
8 Product p(); // Erreur : Ch d’une fonction ?
déclaration
9 Product p1; // OK
10 Product p{}; // OK
11
Initialisation uniforme
Attention !!!
å Lorsque vous utilisez des initialiseurs accolés avec le mot-clé auto, il est important de faire
attention
Z Avec C++11 et C++14, l’initialisation d’une valeur unique est interprétée comme
std::initializer_list<int>
ID
Z Par contre avec C++17, l’initialisation d’une
r AB
valeur unique est interprétée comme
valeur unique Chiheb Ameur u
e ABID
m
ebA
C hih
1 /* C++11 and C++14 */
2 auto i {10}; // i est de type std::initializer_list<int> !!!
3 auto pi = {3.14159}; // pi est de type std::initializer_list<double>
4 auto list1{1, 2, 3}; // list1 est de type std::initializer_list<int>
5 auto list2 = {4, 5, 6}; // list2 est de type std::initializer_list<int>
6
7 /* C++17 */
8 auto i {10}; // i has type int
9 auto pi = {3.14159}; // pi has type std::initializer_list<double>
10 auto list1{1, 2, 3}; // error: does not compile!
11 auto list2 = {4, 5, 6}; // list2 has type std::initializer_list<int>
Journée 1 Chiheb Ameur ABID 41/ 68
Les nouveautés du langage C++11/C++17
Z L’instruction switch
Journée 1 Chiheb Ameur ABID 43/ 68
Les nouveautés du langage C++11/C++17
ID
r AB
Chiheb Ameur u
e ABID
Initialisation dans l’instruction switch
b Am
ih e
1 #include <iostream> Ch
2 #include <cstdlib>
3 int main() {
4 srand(time(NULL));
5 switch (int i = rand() % 100; i) {
6 case 42:
7 std::cout << "La chance! Vous avez obtenu 42." << std::endl;
8 break;
9 default:
10 std::cout << "Vous avez obtenu " << i << "." << std::endl;
11 break;
12 }
13 }
Journée 1 Chiheb Ameur ABID 44/ 68
Les nouveautés du langage C++11/C++17
Liaison structurée
Présentation
å Fonctionnalité introduite en C++17
BID
Z Faciliter l’accès aux éléments individuels de l’objet
A
å Syntaxe générale
Chiheb Ameur meur ABID
1 auto [a, b, c, ...] = expression;eb
A
2 auto [a, b, c, ...] { h
expressionih };
3 auto [a, b, c, ...] ( C );
expression
Liaison structurée
Liaison structurée
Liaison structurée
Liaison structurée
Utilisation de std::tie
å std::tie crée un tuple de références à partir de ses arguments
Z Le tuple créé ne possède pas ses propres valeurs mais agit comme un alias pour les
variables existantes
ID
AB multiple
å Utile pour décomposer des tuples et pour l’affectation
r
Chiheb Ameur u
e ABID
b Am
ih e
1 int tab[] {0,1,2,3,4,5}; Ch
2 auto [a,b] {std::tie(tab[0],tab[3])}; // a=tab[0] et b=tab[3]
3 std::tie(tab[0],tab[3])=std::tuple{0,0}; // tab[0]=0 et tab[3]=0
4
5 struct S {
6 int n;
7 std::string st;
8 float d;
9 } o;
10 auto [a,b] = std::tie(o.n,[Link]);
11 std::tie(a,b) = std::tie(o.n,[Link]);
Journée 1 Chiheb Ameur ABID 49/ 68
Références et expressions
Plan
2 Littéraux
ID
r AB
3 Les espaces de noms Chiheb Ameur u
e ABID
b Am
ih e
4 Ch
Les nouveautés du langage C++11/C++17
5 Références et expressions
6 Les attributs
Journée 1 Chiheb Ameur ABID 50/ 68
Références et expressions
Catégories d’expressioms
ID
r AB
Chiheb Ameur u
e ABID
Notion de value-ness
b Am
ih e
Ch dans exactement l’une des trois catégories suivantes :
å Chaque expression peut être classée
Z lvalue (left value)
Z prvalue (pure rvalue)
Z xvalue (valeur expirante)
å Une expression qui est une lvalue ou une xvalue est appelée une glvalue
(generalized lvalue).
å Une expression qui est une prvalue ou une xvalue est appelée une rvalue
å Chaque expression est soit une lvalue, soit une rvalue (mais pas les deux).
å La possibilité de déplacer (au lieu de copier) une valeur dépend de son type : lvalue ou
rvalue
Journée 1 Chiheb Ameur ABID 51/ 68
Références et expressions
Notion de value-ness
Lvalue
å lvalue (left value) est une expression qui :
Z Désigne une fonction ou un objet ; et
Z Possède une identité : elle occupe un emplacement identifiable en mémoire et, par
conséquent, on peut en principe prendre son adresse
D I
r AB
u
Chiheb Ameurmepouvait
Une expression lvalue est tout bceAqui
ABID
traditionnellement être à
ih e
gauche de l’opérateur d’affectation
C h
Expressions lvalue
å Les objets et fonctions nommés sont des lvalues
1 int getValue();
2 int i = 0;
3 const int j = 1;
4 i = j + 1; // i et j sont des lvalues
5 getValue(); // getValue est une lvalue [Note : pas getValue()]
Journée 1 Chiheb Ameur ABID 52/ 68
Références et expressions
Notion de value-ness
Expressions lvalue
å Pointeur déréférencé
Z Si e est une expression de type pointeur, alors *e est une lvalue
1 char buffer[] = "Hello";
2 char* s = buffer;
*s = ’a’; // *s est une lvalue ID
AB
3
4 *(s + 1) = ’b’; // *(s + 1) est une lvalue
u r
e ABID
Chiheb Ameur
å b Am
Le résultat de l’appel d’une fonction edont le type de retour est une référence lvalue est une
ih
lvalue Ch
1 std::vector<int> v = {{1, 2, 3}};
2 // int& std::vector<int>::operator[](int);
3 int i = v[0]; // v[0] is lvalue
å Les références rvalue vers des fonctions (nommées et non-nommées) sont des lvalues.
Journée 1 Chiheb Ameur ABID 53/ 68
Références et expressions
Notion de value-ness
Expressions prvalue
å Une prvalue est une expression qui :
Z Est un objet temporaire ou un sous-objet d’un objet temporaire, ou une valeur qui
n’est pas associée à un objet
ID en principe prendre son adresse).
Z N’a pas d’identité (c’est-à-dire, qu’on ne peut pas
B
A
Chiheb Ameur
m eur ABID
å Une prvalue est un type spécifique de rvalue
Z Tous les prvalues sont des rvalues, A
b mais tous les rvalues ne sont pas des prvalues.
ihe et englobe les prvalues ainsi que d’autres types
Z Le terme "rvalue" est plus général
h
C pas des objets.
d’expressions qui ne désignent
Expressions prvalue
å Les objets temporaires sont des prvalues
1 std::vector<int> v;
2 v = std::vector<int>(10, 2); // std::vector<int>(10, 2) est une prvalue
3 std::complex<double> u;
4 u = std::complex<double>(1, 2); // std::complex<double>(1, 2) est une prvalue
Journée 1 Chiheb Ameur ABID 54/ 68
Références et expressions
Notion de value-ness
Expressions prvalue
å Un appel de fonction dont le type de retour n’est pas un type de référence est une
prvalue
1 int func();
2 int i = func(); // func() est une prvalue
ID
r AB
å Tous les littéraux sauf les littéraux
Chihebde chaîne
Ameur u
esontABID
des prvalues
Am
double pi = 3.1415; // 3.1415 esteb une prvalue
1
ih
2
3
int i = 42; // 42 est une prvalue
Ch
i = 2 * i + 1; // 2 et 1 sont des prvalues
4 char c = ’A’; // ’A’ est une prvalue
å Le résultat produit par certains opérateurs intégrés (par exemple, +, -, *, /) est une
prvalue
1 int i, j;
2 i = 3 + 5; // 3 + 5 est une prvalue
3 j = i * i; // i * i est une prvalue
Notion de value-ness
rvalue et lvalue
å lvalue (left value) : référence sur une variable (dans la pile) ou un espace alloué
dynamiquement (dans le tas) doté d’une adresse BI
D
r A
Z Tout ce qui pouvait traditionnellement
Chiheb Ameur u
eêtre ABID
à gauche de l’opérateur d’affectation
Am
å rvalue (right value - prvalue depuisebC++11) : les valeurs (ie. contenus) que l’on peut
ih
mettre dans une lvalue Ch
Z Ces valeurs peuvent très bien être retournées par une fonction
Z Une valeur n’a pas d’adresse
å Il est possible de transformer une lvalue en une rvalue à l’aide de la fonction std::move
Z std::move ne déplace rien, juste elle effectue une sorte de casting (conversion)
Journée 1 Chiheb Ameur ABID 56/ 68
Références et expressions
Notion de value-ness
Les références ID
AB
Chiheb Ameur eur
å Les références sont des alias d’objets ou de fonctions
ABID
déjà existants
å Am et rvalue0, alors il existe deux types de
Comme il existe deux types de valeursb(lvalue
références ih e
Ch
¶ les références lvalue, denotées par &, tel que &x, sont des références de lvalues.
· les références rvalue, denotées par &&, tel que &&x, sont des références de rvalues
Journée 1 Chiheb Ameur ABID 57/ 68
Références et expressions
Inférence de type
Z Utile pour éviter d’avoir à construire un nom compliqué lié à l’usage des templates
1 vector<vector<int> > v;
2 // C++98 (sans auto)
3 for (vector<vector<int> >::iterator
4 i=[Link](); i!=[Link]();++i)
5 // C++11
6 for (auto i=[Link](); i!=[Link]();++i)
Journée 1 Chiheb Ameur ABID 58/ 68
Références et expressions
Inférence de type
Inférence de type
Plan
2 Littéraux
ID
r AB
3 Les espaces de noms Chiheb Ameur u
e ABID
b Am
ih e
4 Ch
Les nouveautés du langage C++11/C++17
5 Références et expressions
6 Les attributs
Journée 1 Chiheb Ameur ABID 61/ 68
Les attributs
Les attributs
Présentation
å Une fonctionnalité introduite avec C+11 pour fournirDdes informations supplémentaires au
I
compilateur
r AB
u
Z Optimisation du code Chiheb Ameur me ABID
Z Génération du code spécifique eb A
ih
Ch remplacer les extensions spécifiques aux compilateurs
å Les attributs ont été introduits pour
comme __attribute__ de GCC ou __declspec de MSVC depuis C++11
å Syntaxe
[[attribute]]
Journée 1 Chiheb Ameur ABID 62/ 68
Les attributs
Les attributs
Evolution
¶ C++11
Z Introduction des attributs
ID
AB
1 [[noreturn]]
2 [[carries_dependency]]
u r
e ABID
Chiheb Ameur
b Am
· C++14
ih e
Ch
Z Introduction de l’attribut [[deprecated]] pour marquer une entité obsolète
¸ C++17
Z Ajout des attributs
1 [[fallthrough]]
2 [[nodiscard]]
3 [[maybe_unused]]
Les attributs
Attributs de C++11
å L’attribut [[noreturn]]
Z Une fonction ne retourne jamais comme exit() ID
r AB
Z Comportement indéfini si la fonction retourne
Chiheb Ameure u
ABID
b Am
1
ih e
[[noreturn]] void terminerProgramme() {
2
3
Ch
std::cout << "Le programme va se terminer." << std::endl;
std::exit(1); // Termine le programme avec le code de sortie 1
4 }
å L’attribut [[carries_dependency]]
Z Indiquer qu’une dépendance de données est portée à travers les appels de fonction
dans le contexte multithreadé
Journée 1 Chiheb Ameur ABID 64/ 68
Les attributs
Les attributs
Attributs de C++14
å L’attribut [[deprecated]]
ID
Z Indiquer une entité obsolète
r AB
Z Peut être accompagné d’un message
Chiheb u
e ABID
Ameurm
ebA
C hih
1 void h( int& x );
2
3 [[deprecated]] int f();
4 [[deprecated("La fonction g() est depreeiee. Utilisez plutôt la fonction h()")]] void
g( int& x );
Journée 1 Chiheb Ameur ABID 65/ 68
Les attributs
Les attributs
Attributs de C++17
å L’attribut [[maybe_unused]]
Z Supprimer les avertissements concernant les éléments inutilisés : variables,
paramètres et fonctions
ID
r AB
Chiheb Ameur u
e ABID
[[maybe_unused]] void fonctionInutilisee()b Am{
1
2 // Code qui pourrait ne pas être h ih e
appelé
3 } C
4
5 int main() {
6 [[maybe_unused]] int valeurInutilisee {42};
7 auto fonctionAvecParametreInutilise = []( [[maybe_unused]] int parametre ) {
8 std::cout << "Cette fonction pourrait ne pas utiliser son paramètre." << std::endl
;
9 };
10 fonctionAvecParametreInutilise(10);
11 return 0;
12 }
Journée 1 Chiheb Ameur ABID 66/ 68
Les attributs
Les attributs
Attributs de C++17
å L’attribut [[nodiscard]]
Z Ne pas ignorer la valeur de retour : si la valeur de retour est ignorée, le compilateur
génère un avertissement
ID
r AB
Chiheb Ameur u
e ABID
[[nodiscard]] int Amb) {
calculerSomme(int a, bint
1
ih e
Ch
2 return a + b;
3 }
4
5 int main() {
6 calculerSomme(3, 4); // Ceci va générer un avertissement
7
8 int somme = calculerSomme(3, 4); // Pour éviter l’avertissement, il faut utiliser
la valeur de retour.
9 std::cout << "La somme est : " << somme << std::endl;
10
11 return 0;
12 }
Journée 1 Chiheb Ameur ABID 67/ 68
Les attributs
Les attributs
Attributs de C++17
å L’attribut [[fallthrough]]
Z Utilisé dans les instructions switch pour indiquer explicitement qu’un case est
conçu pour tomber dans le case suivant sans interruption.
ID
r AB
1 int main() {
Chiheb Ameur u
e ABID
2 int jour {3};
b Am
3 switch (jour) {
ih e
4
5
case 1: std::cout <<
case 2: std::cout <<
Ch
"Lundi"; break;
"Mardi"; break;
6 case 3:
7 std::cout << "Mercredi";
8 [[fallthrough]]; // Indique intentionnellement qu’il n’y a pas de ’break’
9 case 4:
10 std::cout << " et jeudi aussi!";
11 break;
12 default:
13 std::cout << "Un autre jour";
14 break;
15 }
16 return 0;
17 }
Journée 1 Chiheb Ameur ABID 68/ 68
Les attributs
ID
r AB
Chiheb Ameur u
e ABID
b Am
ih e
Ch
Questions ?