C++17
À partir de fr.cppreference.net
< cpp
C++17 est une version majeure qui suit la version mineure C++14 et introduit de nouvelles fonctionnalités du langage et de la bibliothèque. La norme a été publiée en décembre 2017.
Les fonctionnalités suivantes ont été fusionnées dans C++17 :
- De la TS File System : la bibliothèque de systèmes de fichiers.
- De la TS Fundamentaux de la bibliothèque v1 : fonctionnalités, y compris std::any, std::optional, std::string_view, std::apply, allocateurs polymorphes, chercheurs.
- De la TS Fundamentaux de la bibliothèque v2 : std::void_t, std::conjunction, std::disjunction, std::negation, std::not_fn, std::gcd, std::lcm.
- De la TS Parallélisme v1 : fonctionnalités, y compris politiques d'exécution, std::reduce, std::inclusive_scan, std::exclusive_scan, mais en supprimant
exception_list. - De la IS Fonctions spéciales mathématiques : fonctions spéciales mathématiques.
- De C11 : std::aligned_alloc, std::timespec_get.
| Cette section est incomplète |
Fonctionnalités obsolètes
Fonctionnalités supprimées
- std::auto_ptr,
- objets fonction dépréciés,
- std::random_shuffle,
- std::unexpected,
- les alias obsolètes
iostreams, - trigrammes,
- le mot-clé register,
boolincrément,- spécification d'exception dynamique
Fonctionnalités dépréciées
- std::iterator,
- std::raw_storage_iterator,
- std::get_temporary_buffer,
- std::is_literal_type,
- std::result_of,
- tous les <codecvt>
Nouvelles fonctionnalités du langage
u8littéral de caractère- rendu noexcept partie du système de types
- nouvelles règles d'ordre d'évaluation
- capture lambda de
*this
- constexpr
- à la compilation if constexpr
- lambda constexpr
- Variables
- variables inline
- liaisons structurées
- initialiseurs pour if et switch
- élision de copie
- garantie matérialisation temporaire
- Modèles
- expressions de repli
( ... ) - déduction d'argument de modèle de classe
tuple t(4, 3, 2.5) - paramètres de modèle non-type déclarés avec
auto
- expressions de repli
- Espaces de noms
- espaces de noms imbriqués simplifiés
usingdéclaration déclarant plusieurs noms- espaces de noms d'attributs n'ont pas besoin de se répéter
- nouveaux attributs :
[[fallthrough]][[maybe_unused]][[nodiscard]]
- __has_include
Nouveaux en-têtes
Nouvelles fonctionnalités de la bibliothèque
Types utilitaires
- std::tuple :
- std::apply
- std::make_from_tuple
- guides de déduction
- std::any
- std::optional
- std::variant
- chercheurs
- std::as_const
- std::not_fn
Gestion de la mémoire
- algorithmes de mémoire non initialisée
- std::destroy_at
- std::destroy
- std::destroy_n
- std::uninitialized_move
- std::uninitialized_value_construct
- weak_from_this
- std::pmr::memory_resource et std::polymorphic_allocator
- std::aligned_alloc
- transparent std::owner_less
- support des tableaux pour std::shared_ptr
- fonctions d'allocation avec alignement explicite
Programmation à la compilation
- std::byte
- std::conjunction/std::disjunction/std::negation
- traits de type variables template (
xxx_+v) - std::is_swappable
- std::is_invocable
- std::is_aggregate
- std::has_unique_object_representations
Algorithmes
- std::clamp
- algorithmes parallèles et politiques d'exécution
- std::inclusive_scan
- std::exclusive_scan
- std::gcd
- std::lcm
- std::reduce
Itérateurs et conteneurs
- map/set extract et map/set merge
- map/unordered_map try_emplace et insert_or_assign
- itérateurs contigus (LegacyContiguousIterator)
- non-membre std::size/std::empty/std::data
Numérique
- fonctions spéciales mathématiques
- 3D std::hypot
Autres
- interface de ligne de cache
- std::launder
- std::uncaught_exceptions
- std::to_chars/std::from_chars
- std::atomic<T>::is_always_lock_free
- std::scoped_lock
- std::timespec_get
- fonctions d'arrondi pour std::chrono::duration et std::chrono::time_point
Rapports de défauts
Prise en charge du compilateur
Fonctionnalités de base du langage C++17
| Fonctionnalité C++17 |
Papier(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 auto règles pour 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 modèle 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 trigrammes | 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ère
|
N4267 | 6 | 3.6 | 19.0 (2015)* | Oui | 4.11 | 17.0 | 17.7 | 11.0 | 11.0 | 10.3 | 17.1.0 | |
| Permettre 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 dépréciée 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 le operator++(bool)
|
déprécié P0002R1 | 7 | 3.8 | 19.11* | Oui | 4.13 | 18.0 | 17.7 | 11.0 | 11.0 | 10.3 | 17.1.0 | |
| Faire des spécifications d'exception une partie du système de types (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 les constructeurs hérités (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égats 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 begin et end différents dans 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 virgule flottante hexadécimaux (FTM)* | P0245R1 | 3.0 | Oui | 19.11* | Oui | 4.13 | 18.0 | 17.7 | 11.0 | 11.0 | 10.3 | 17.1.0 | |
| Utiliser 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 auto type (FTM)*
|
P0127R2 | 7 | 4 | 19.14* | Oui | 5.0 | 19.0.1 | 19.1 | 11.0 | 11.0 | 10.3 | 17.1.0 | |
| Élision de copie garantie (FTM)* | P0135R1 | 7 | 4 | 19.13* | Oui | 5.0 | 19.0.1 | 19.1 | 11.0 | 11.0 | 10.3 | 17.1.0 | |
| Remplacement d'objets de classe contenant des membres de référence | P0137R1 | 7 | 6 | 19.14* | Oui | 5.0 | 19.1 | 11.0 | 11.0 | 10.3 | 17.1.0 | ||
| Ordre d'évaluation des expressions plus strict | 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 | P0283R2 | Oui | 3.9 | 19.0 (2015)* | Oui | 4.13 | 18.0 | 17.7 | 11.0 | 11.0 | 10.3 | 17.1.0 | |
| Instructions constexpr if (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 | |
| Expansions de pack dans les using-déclarations (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 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'argument 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 |
Papier(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
| Fonctionnalité C++17 |
Papier(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 | ||
| Traits de type variables template (FTM)* | P0006R0 | 7.1 | 3.8 | 19.0 (Update 2)* | Oui | 17.1.0 | N/A | 10.3 | |
| Traits de type d'opérateur logique (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 | ||
| Transparent 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 swappable (nothrow-) (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 spéciales mathématiques (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 | ||
| Splicing 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 conteneurs changé 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 | |
| Problème CWG 1776 : Remplacement d'objets de classe contenant des membres de référence (std::launder) (FTM)* | P0137R1 | 7.1 | 6 | 19.14* | Oui | 17.1.0 | N/A | ||
| Extension des outils de gestion de la mémoire (FTM)* | P0040R3 | 7.1 | 4 (partiel)* | 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èmes 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 |
Papier(s) |
GCC libstdc++ |
Clang libc++ |
MSVC STL |
Apple Clang* |
IBM Open XL C/C++ for AIX* |
Intel Parallel STL |
Embarcadero C++ Builder* |
Remarques
- Au 20 novembre 2020, la dernière version d'Oracle Developer Studio est 12.6. Sa documentation ne mentionne pas C++17.
- Le compilateur Cray peut prendre en charge certaines fonctionnalités avant la version 11.0. Cette version est celle où il est devenu un dérivé de Clang, acquérant ainsi toute la prise en charge des fonctionnalités du langage 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.
DRnn - 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 C++17 fonctionnels |