Namespaces
Variants

C++17

From cppreference.net

C++17 est une version majeure qui suit la version mineure C++14 et introduit de nouvelles fonctionnalités de langage et de bibliothèque. La norme a été publiée en décembre 2017.

Les fonctionnalités suivantes ont été intégrées dans C++17 :

Table des matières

Fonctionnalités obsolètes

Fonctionnalités supprimées
Fonctionnalités dépréciées

Nouvelles fonctionnalités du langage

Nouveaux en-têtes

Nouvelles fonctionnalités de la bibliothèque

Types utilitaires

Gestion de la mémoire

Programmation à la compilation

Algorithmes

Itérateurs et conteneurs

Numériques

Autres

Rapports de défauts

Rapports de Défauts corrigés dans C++17 (290 noyau, 363 bibliothèque)

Support du compilateur

Fonctionnalités principales du langage C++17

**Notes sur la traduction :** - "statements" → "instructions" (terme technique standard en programmation) - "Feature-testing macro" → "Macro de test de fonctionnalité" - "Yes" → "Oui" - "constexpr if" conservé tel quel (terme C++ spécifique) - Toutes les balises HTML et attributs préservés - Les valeurs numériques et codes (FTM, P0292R2) non traduits
Fonctionnalité C++17

Document(s)

GCC
Clang
MSVC
Apple Clang
EDG eccp
Intel C++
Nvidia HPC C++ (ex PGI)*
Nvidia nvcc
Cray
Embarcadero C++ Builder
IBM Open XL C++ for AIX
DR11 : Nouvelles règles pour auto dans l'initialisation directe par liste N3922 5 3.8 19.0 (2015)* Oui 4.10.1 17.0 17.7 11.0 11.0 10.3 17.1.0
typename dans un paramètre de template template N4051 5 3.5 19.0 (2015)* Oui 4.10.1 17.0 17.7 Oui* 11.0 10.3 17.1.0
Suppression des trigraphs N4086 5 3.5 16.0* Oui 5.0 19.1 11.0 11.0 10.3 17.1.0
Définition d'espace de noms imbriqué N4230 6 3.6 19.0 (Update 3)* Oui 4.12 17.0 17.7 11.0 11.0 10.3 17.1.0
static_assert sans message  ( FTM ) * N3928 6 2.5 19.10* Oui 4.12 18.0 17.7 11.0 11.0 10.3 17.1.0
Attributs pour les espaces de noms et les énumérateurs  ( FTM ) * ( FTM ) * N4266 4.9 (partiel)*
6
3.6 19.0 (2015)* Oui 4.11 17.0 17.7 11.0 11.0 10.3 17.1.0
u8 littéraux de caractères N4267 6 3.6 19.0 (2015)* Oui 4.11 17.0 17.7 11.0 11.0 10.3 17.1.0
Autoriser l'évaluation constante pour tous les arguments de template constants  ( FTM ) * N4268 6 3.6 19.12* Oui 5.0 19.0.1 19.1 11.0 11.0 10.3 17.1.0
Expressions de repli unaires et packs de paramètres vides P0036R0 6 3.9 19.12* Oui 4.14 19.0 19.1 11.0 11.0 10.3 17.1.0
Supprimer l'utilisation obsolète du mot-clé register P0001R1 7 3.8 19.11* Oui 4.13 18.0 17.7 11.0 11.0 10.3 17.1.0
Supprimer l'opérateur déprécié operator ++ ( bool ) P0002R1 7 3.8 19.11* Oui 4.13 18.0 17.7 11.0 11.0 10.3 17.1.0
Intégrer les spécifications d'exception au système de type  ( FTM ) * P0012R1 7 4 19.12* Oui 4.14 19.0 19.1 11.0 11.0 10.3 17.1.0
__has_include dans les conditionnelles du préprocesseur P0061R1 5 Oui 19.11* Oui 4.13 18.0 17.7 11.0 11.0 10.3 17.1.0
DR11 : Nouvelle spécification pour l'héritage des constructeurs ( DR1941 et al)  ( FTM ) * P0136R1 7 3.9 19.14* * Oui 6.1 19.1 11.0 11.0 10.3 17.1.0
Classes agrégées avec classes de base  ( FTM ) * P0017R1 7 3.9 19.14* Oui 5.0 19.0.1 19.1 11.0 11.0 10.3 17.1.0
Expressions de repli ( FTM ) * N4295 6 3.6 19.12* Oui 4.14 19.0 18.1 11.0 11.0 10.3 17.1.0
Capture lambda de * this ( FTM ) * P0018R3 7 3.9 19.11* Oui 4.14 19.0 18.1 11.0 11.0 10.3 17.1.0
Initialisation directe par liste des énumérations P0138R2 7 3.9 19.11* Oui 4.14 18.0 19.1 11.0 11.0 10.3 17.1.0
constexpr expressions lambda ( FTM ) * P0170R1 7 5 19.11* Oui 4.14 19.0 18.1 11.0 11.0 10.3 17.1.0
Types différents pour begin et end dans la boucle range-based for ( FTM ) * P0184R0 6 3.9 19.10* Oui 4.12 18.0 17.7 11.0 11.0 10.3 17.1.0
[[ fallthrough ]] attribut P0188R1 7 3.9 19.10* Oui 4.13 18.0 17.7 11.0 11.0 10.3 17.1.0
[[ nodiscard ]] attribut P0189R1 7 3.9 19.11* Oui 4.13 18.0 17.7 11.0 11.0 10.3 17.1.0
[[ maybe_unused ]] attribut P0212R1 7 3.9 19.11* Oui 4.13 18.0 17.7 11.0 11.0 10.3 17.1.0
Littéraux hexadécimaux à virgule flottante ( FTM ) * P0245R1 3.0 Oui 19.11* Oui 4.13 18.0 17.7 11.0 11.0 10.3 17.1.0
Utilisation des espaces de noms d'attributs sans répétition P0028R4 7 3.9 19.11* Oui 4.13 18.0 17.7 11.0 11.0 10.3 17.1.0
Allocation dynamique de mémoire pour les données sur-alignées  ( FTM ) * P0035R4 7 4 19.12* 10.0.0* 4.14 19.0 19.1 11.0 11.0 10.3 17.1.0
Paramètres de template constants avec type auto ( FTM ) * P0127R2 7 4 19.14* Oui 5.0 19.0.1 19.1 11.0 11.0 10.3 17.1.0
Élimination garantie des copies ( FTM ) * P0135R1 7 4 19.13* Oui 5.0 19.0.1 19.1 11.0 11.0 10.3 17.1.0
Remplacement des objets de classe contenant des membres référence P0137R1 7 6 19.14* Oui 5.0 19.1 11.0 11.0 10.3 17.1.0
Évaluation d'expression plus stricte expression evaluation order P0145R3 7 4 19.14* Oui 5.0 19.0.1 19.1 11.0 11.0 10.3 17.1.0
Liaisons Structurées ( FTM ) * P0217R3 7 4 19.11* Oui 4.14 19.0 18.1 11.0* 11.0 10.3 17.1.0
Ignorer les attributs inconnus attributes P0283R2 Oui 3.9 19.0 (2015)* Oui 4.13 18.0 17.7 11.0 11.0 10.3 17.1.0
constexpr if instructions  ( FTM ) * P0292R2 7 3.9 19.11* Oui 4.14 19.0 18.1 11.0 11.0 10.3 17.1.0
Instructions d'initialisation pour if et switch P0305R1 7 3.9 19.11* Oui 4.14 18.0 18.1 11.0 11.0 10.3 17.1.0
Variables inline ( FTM ) * P0386R2 7 3.9 19.12* Oui 4.14 19.0 18.1 11.0 11.0 10.3 17.1.0
Suppression des spécifications d'exception dynamiques P0003R5 7 4 19.12* Oui 4.14 19.0 19.1 11.0 11.0 10.3 17.1.0
Développements de paquets dans les déclarations using  ( FTM ) * P0195R2 7 4 19.14* Oui 5.0 19.0 19.1 11.0 11.0 10.3 17.1.0
DR98 : La correspondance des arguments de template de template exclut les templates compatibles  ( FTM ) * P0522R0 7 4 19.12* Oui 5.0 19.0.1 19.1 11.0 11.0 10.3 17.1.0
Déduction d'arguments de modèle de classe ( FTM ) * P0091R3 7 5 19.14* Oui 5.0 19.0.1 19.1 11.0 11.0 10.3 17.1.0


Fonctionnalité C++17


Document(s)
GCC
Clang
MSVC
Apple Clang
EDG eccp
Intel C++
Nvidia HPC C++ (ex PGI)*
Nvidia nvcc
Cray
Embarcadero C++ Builder
IBM Open XL C++ for AIX

Fonctionnalités de la bibliothèque C++17

**Modifications apportées :** - Traduit "Feature-testing macro" par "Macro de test de fonctionnalité" dans l'attribut `title` - Traduit "Yes" par "Oui" dans le contenu textuel - Conservé tous les termes C++ (`std::void_t`, `__cpp_lib_void_t`, `FTM`) - Préservé toutes les balises HTML et attributs - Conservé le texte dans les balises ` `, `
`, `` (bien qu'aucune ne soit présente dans cet extrait)
- Maintenu la mise en forme et la structure HTML d'origine
**Traductions effectuées :** - "cleanups" → "nettoyages" - "Feature-testing macro" → "Macro de test de fonctionnalité" **Éléments préservés :** - Toutes les balises HTML et leurs attributs - Le contenu des balises ` ` et `
` (bien qu'aucune ne soit présente ici)
- Les termes spécifiques au C++ (`std::allocator_traits::is_always_equal`, `noexcept`, `__cpp_lib_allocator_traits_is_always_equal`)
- Les acronymes (`FTM`, `N/A`)
- Les numéros de versions et références
- La mise en forme originale
Les modifications apportées : - Traduction de "Feature-testing macro" en "Macro de test de fonctionnalité" dans l'attribut `title` - Traduction de "Yes" en "Oui" - Conservation de tous les termes C++ (`std::as_const`, `__cpp_lib_as_const`, FTM, P0007R1) - Préservation de tous les tags HTML et attributs - Maintien du texte dans les balises ` `, `
`, `` (bien qu'aucune ne soit présente dans cet extrait)
Fonctionnalité C++17

Document(s)

GCC libstdc++
Clang libc++
MSVC STL
Apple Clang*
IBM Open XL C/C++ for AIX*
Intel Parallel STL
Embarcadero C++ Builder*
std::void_t ( FTM ) * N3911 6.1 3.6 19.0 (2015)* Oui 17.1.0 N/A 10.3
std::uncaught_exceptions() ( FTM ) * N4259 6.1 3.7 19.0 (2015)* Oui 17.1.0 N/A 10.3
std::size() , std::empty() et std::data() ( FTM ) * N4280 6 3.6 19.0 (2015)* Oui 17.1.0 N/A 10.3
std::allocator_traits::is_always_equal , noexcept nettoyages  ( FTM ) * N4258 6.1 3.7 19.0 (2015)* 17.1.0 N/A
std::invoke ( FTM ) * N4169 6.1 3.7 19.0 (2015)* Oui 17.1.0 N/A
std::map::try_emplace , std::map::insert_or_assign ( FTM ) * N4279 6.1 3.7 19.0 (2015)* Oui 17.1.0 N/A
std::unordered_map::try_emplace , std::unordered_map::insert_or_assign ( FTM ) * N4279 6.1 3.7 19.0 (2015)* Oui 17.1.0 N/A
Amélioration de std::pair et std::tuple N4387 6.1 4 19.0 (Update 2)* Oui 17.1.0 N/A 10.3
std::bool_constant ( FTM ) * N4389 6.1 3.7 19.0 (2015)* Oui 17.1.0 N/A 10.3
std::shared_mutex (sans temporisation)  ( FTM ) * N4508 6 3.7 19.0 (Update 2)* Oui 17.1.0 N/A 10.3
Prise en charge minimale des types incomplets pour std::forward_list , std::list , et std::vector ( FTM ) * N4510 3.0 3.6 18.0* Oui 17.1.0 N/A
Modèles de variables de traits de type ( FTM ) * P0006R0 7.1 3.8 19.0 (Update 2)* Oui 17.1.0 N/A 10.3
Traits de types d'opérateurs logiques ( FTM ) * P0013R1 6.1 3.8 19.0 (Update 2)* Oui 17.1.0 N/A 10.3
std::as_const ( FTM ) * P0007R1 7.1 3.8 19.0 (Update 2)* Oui 17.1.0 N/A
Fonctions d'arrondi pour std::chrono::duration et std::chrono::time_point ( FTM ) * P0092R1 7.1 3.8 19.0 (Update 2)* Oui 17.1.0 N/A
Opérateurs transparents std::owner_less ( std::owner_less<void> )  ( FTM ) * P0074R0 7.1 3.8 19.0 (Update 2)* Oui 17.1.0 N/A
std::not_fn ( FTM ) * P0005R4
P0358R1
7.1 3.9 19.12* Oui 17.1.0 N/A 10.3
Algorithmes parallèles et politiques d'exécution ( FTM ) * ( FTM ) * P0024R2 9* 17
(partiel)*
19.14* 18.0*
std::clamp() ( FTM ) * P0025R1 7 3.9 19.0 (Update 3)* 10.0.0* 17.1.0 N/A 10.3
Traits (nothrow-)swappable ( FTM ) * P0185R1 7.1* 3.9 19.0 (Update 3)* 10.0.0* 17.1.0 N/A 10.3
Ressources mémoire polymorphes ( FTM ) * P0220R1 9.1 16 19.13* 15.0.0* 17.1.1 N/A 10.3
std::apply ( FTM ) * P0220R1 7.1 16 19.13* Oui 17.1.0 N/A
Chercheurs ( FTM ) * P0220R1 7.1 16 19.13* Oui 17.1.0 N/A
std::sample ( FTM ) * P0220R1 7.1 16 19.13* Oui 17.1.0 N/A
Fonctions mathématiques spéciales ( FTM ) * P0226R1 7 19.14* 17.1.1 N/A 10.3
constexpr std::addressof ( FTM ) * LWG2296 7.1 Oui 19.0 (Update 3)* 17.1.0 N/A
constexpr pour std::reverse_iterator , std::move_iterator , std::array et l'accès aux plages ( FTM ) * P0031R0 7.1 4 19.11* Oui 17.1.0 N/A
constexpr std:: atomic < T > :: is_always_lock_free ( FTM ) * P0152R1 7.1 3.9 19.11* Oui 17.1.0 N/A
std::enable_shared_from_this::weak_from_this ( FTM ) * P0033R1 7.1 3.9 19.12* Oui 17.1.0 N/A
Surcharge à 3 arguments de std::hypot ( FTM ) * P0030R1 7.1 3.9 19.14* Oui 17.1.0 N/A
std::byte ( FTM ) * P0298R3 7 5 19.11* Oui 17.1.1 N/A 10.3
std::string_view ( FTM ) * N3921
P0220R1
P0254R2
P0403R1
7.1 4 19.10* (partiel)*
19.11* *
10.0.0* 17.1.0 N/A 10.3
std::any ( FTM ) * P0220R1
P0032R3
7.1 4 19.10* 10.0.0* 17.1.0 N/A 10.3
std::optional ( FTM ) * P0220R1 7.1 4 19.10* 10.0.0* 17.1.0 N/A 10.3
Partie majeure de la bibliothèque standard C11 P0063R3 9.1 7 19.0 (2015)*
(partiel)*
10.0.0* 17.1.1 N/A
Splicage Maps et Sets ( FTM ) * P0083R3 7 8 19.12* 10.0.0* 17.1.1 N/A
type de retour des fonctions emplace * de certains containers modifié de void à référence P0084R2 7.1 4.0 19.11* Oui 17.1.0 N/A
std::variant ( FTM ) * P0088R3 7.1 4 19.10* 10.0.0* 17.1.0 N/A 10.3
std::make_from_tuple() ( FTM ) * P0209R2 7.1 3.9 19.10* Oui 17.1.0 N/A 10.3
std::has_unique_object_representations ( FTM ) * P0258R2 7.1 6 19.11* Oui 17.1.1 N/A 10.3
std::gcd() et std::lcm() ( FTM ) * P0295R0 7 4 19.11* Oui 17.1.0 N/A 10.3
CWG issue 1776 : Remplacement d'objets de classe contenant des membres référence ( std::launder )  ( FTM ) * P0137R1 7.1 6 19.14* Oui 17.1.0 N/A
Extension des outils de gestion de mémoire ( FTM ) * P0040R3 7.1 4 19.11* 17.1.0 N/A
shared_ptr::weak_type ( FTM ) * P0163R0 7.1 3.9 19.10* Oui 17.1.0 N/A
Conversions élémentaires de chaînes : std:: to_chars / std:: from_chars ( FTM ) * P0067R5 8*
11
7*
14*
20*
19.14* *
19.24*
10.0.0* * 17.1.1* N/A 10.3*
std::shared_ptr et std::weak_ptr avec support des tableaux P0414R2 7 11 19.12* 12.0.0* 17.1.1 N/A 10.3
Constexpr pour toutes les fonctions membres de std::chrono::duration et std::chrono::time_point ( FTM ) * P0505R0 7.1 4 19.11* Oui 17.1.1 N/A
std:: shared_ptr < T [ ] > ( FTM ) * P0497R0 7.1 11 19.12* 17.1.1 N/A
constexpr std::char_traits ( FTM ) * P0426R1 8.1 4 19.14* Oui 17.1.1 N/A
Bibliothèque de système de fichiers ( std::filesystem )  ( FTM ) * P0218R1
P0219R1
8 7 19.14* 11.0.0* 17.1.1 N/A 10.3
Taille d'interférence matérielle ( FTM ) * P0154R1 12.1 15 (partiel)*
19
19.11* N/A 10.3
std::scoped_lock ( FTM ) * P0156R2 7 5 19.11* Oui 17.1.1 N/A 10.3
std::is_aggregate ( FTM ) * LWG2911 7 5 19.15* Oui 17.1.1 N/A 10.3
std::is_invocable , std::invoke_result ( FTM ) * P0604R0 7.1 Oui 19.11* Oui 17.1.1 N/A
DR17 : std::hash<std::filesystem::path> LWG3657 11.4 17 19.32* N/A


Fonctionnalité C++17


Document(s)
GCC libstdc++
Clang libc++
MSVC STL
Apple Clang*
IBM Open XL C/C++ for AIX*
Intel Parallel STL
Embarcadero C++ Builder*
Notes
  • Au 20 novembre 2020, la dernière version d'Oracle Developer Studio est la 12.6 . Sa documentation ne mentionne pas C++17.
  • Le compilateur Cray peut avoir pris en charge certaines fonctionnalités avant la version 11.0. Cette version correspond à son passage à une version dérivée de Clang, héritant ainsi de toute la prise en charge des fonctionnalités linguistiques du compilateur de base. Voir le document Cray/HPE S-2179 .

* - survolez une cellule marquée d'une étoile * pour voir des notes contextuelles supplémentaires.
DR nn - le nombre nn après "DR" désigne la révision C++ cible à laquelle le Rapport de Défaut est appliqué, par exemple, DR20 → C++20.

Liens externes

1. C++17 - Wikipédia
2. Exemples fonctionnels C++17