Namespaces
Variants

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 :

Fonctionnalités obsolètes

Fonctionnalités supprimées
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

Nouveaux en-têtes

Nouvelles fonctionnalités de la bibliothèque

Types utilitaires

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

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

Numérique

Autres

Rapports de défauts

Rapports de défauts corrigés dans C++17 (290 cœur, 363 bibliothèque)

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