Microsoft propose une compilation des fonctionnalités de C++ 17 dans la préversion Visual C++ 2017 version 15.3,
et indique celles qui sont à venir

La préversion Visual Studio 2017 version 15.3 est désormais disponible et s’accompagne d’une mise à jour des outils Visual C ++ (c'est-à-dire le compilateur, le linker et les bibliothèques). Comme Microsoft l’a fait pour les mises à jour VS 2015, l’entreprise a également ajouté des fonctionnalités C ++ 17 dans les mises à jour VS 2017 à une fréquence de publication similaire.

Contrairement aux mises à jour de VS 2015 (qui combinent l'IDE et les changements d'outils), l'EDI de VS 2017 est mis à jour plus fréquemment par des mises à jour mineures. Cette fois-ci, Microsoft a précisé qu’il s'agit de la première mise à jour du jeu d'outils (également appelée « mise à jour fondamentale »).

Voici une table de fonctionnalités compilées accompagnée de quelques notes. Dans cette table figurent également des fonctionnalités à venir qui seront disponibles dans la VS 2017.3 Preview 2 et sont marqués comme étant [P2].
C ++ 03/11 Caractéristiques du langage de base Statut Référence document Notes
[Tout le reste] VS 2015 [A]
Recherche de nom en deux phases Partiel [deuxPhases]
Expression SFINAE Partiel N2634 [B]
Préprocesseur C99 Partiel N1653 [C]
Types entiers étendus N/A N1988 [D]
C ++ 14 Caractéristiques du langage de base Statut Référence de document Notes
Éviter / répartir les allocations N/A N3664 [E]
Modification progressive des conversions contextuelles VS 2013 N3323
Littéraux binaires VS 2015 N3472
Types de retour auto et déclencheur (auto) VS 2015 N3638
Captures initiales VS 2015 N3648
Générique lambdas VS 2015 N3649
Modèles variables VS 2015.2 N3651
Extended constexpr VS 2017 N3652
NSDMI pour agrégats VS 2017 N3653
Attribut [[obsolète]] VS 2015 N3760
Désaffectation dimensionnée VS 2015 N3778
Séparateurs de chiffres VS 2015 N3781
C ++ 17 Caractéristiques du langage de base Statut Référence de document Notes
Nouvelles règles pour auto avec les listes de démarrage VS 2015 N3922 [14]
static_assert VS 2017 N3928
Typename dans le modèle template-parameters VS 2015 N4051 [14]
Suppression de trigraphes VS 2010 N4086 [14]
Définition de noms d'espace imbriqué VS 2015.3 N4230
Correction des conversions de qualification Non N4261
Attributs pour les espaces de noms et les énumérateurs VS 2015 N4266 [14]
U8 caractères littéraires VS 2015 N4267 [14]
Autoriser plus de modèles non typés Non N4268
Fold Expressions Non N4295
Suppression de certains plis unaires vides Non P0036R0
Suppression du mot-clé du registre VS 2017.3 P0001R1
Retrait de l'opérateur ++ pour bool VS 2017.3 P0002R1
Ajout de l'option noexcept au système de type Non P0012R1
Initialisation agrégée étendue Non P0017R1
Capturer *this par valeur VS 2017.3 P0018R3
__has_include VS 2017.3 [P2] P0061R1 [14]
Reformuler les constructeurs héréditaires Non P0136R1
Liste directe des énumérations fixes à partir d'entiers VS 2017.3 P0138R2
constexpr lambdas VS 2017.3 P0170R1
Gamme généralisée pour les boucles VS 2017 P0184R0 [14]
[[fallthrough]] attribut VS 2017 P0188R1
[[nodiscard]] attribut VS 2017.3 P0189R1
[[maybe_unused]] attribut VS 2017.3 P0212R1
littéraux Hexfloat Non P0245R1
Utilisation des espaces de noms d'attributs sans répétition VS 2017.3 P0028R4
Allocation de mémoire dynamique suralimentée Non P0035R4
Déduction d'argument de modèle pour les modèles de classe Non P0091R3
Déclaration de paramètres de modèle sans type avec auto Non P0127R2
Elision de copie garantie VS 2017.3 P0135R1
Ordre d'évaluation de l'expression de raffinage Non P0145R3
Fixations structurées VS 2017.3 P0217R3
Ignorer les attributs non reconnus Non P0283R2
constexpr if-statements VS 2017.3 [P2] P0292R2 [F]
Déclarations de sélection avec les initialiseurs VS 2017.3 [P2] P0305R1
Variables en ligne Non P0386R2
Correspondance des modèles-paramètres du modèle aux arguments compatibles Non P0522R0
Suppression des spécifications d'exception dynamiques Non P0003R5
Expansion des paquets dans les déclarations d'utilisation Non P0195R2

[A] À l'exception des spécifications d'exception dynamiques, qui ont été obsolètes dans C ++ 11 et principalement supprimées dans C ++ 17. Notez que C ++ 17 18.4 [except.spec] / 2 indique "The noexcept-specifier throw () est obsolète (D.3) et équivalent à noexcept noexcept (true)." Mais VS 2017 version 15.3 preview Considère actuellement throw () comme équivalent à __declspec (nothrow).

[deuxPhase] Alors que la recherche de nom en deux phases n'est pas prise en charge dans la préversion VS 2017 version 15.3, l'équipe du compilateur effectue un travail majeur dans les coulisses. Pour la préversion 2, l'option / permissive-compilateur active le support partiel pour la recherche de nom en deux phases (une signification partielle d'environ 60 % complète).

[B] Bien que l'expression SFINAE soit partiellement prise en charge, elle est presque complète. Elle était suffisante pour STL dans VS 2015.2, et Expression SFINAE a reçu d'autres corrections de bogues pour des bibliothèques supplémentaires comme Boost. La déficience restante la plus importante est la nécessité d'utiliser des types d'étiquettes uniques lors de l'exécution de void_t / decltype Expression SFINAE.

[C] Le support du préprocesseur C C99 est encore partiel dans le sens où les macros variadiques fonctionnent presque.

[D] Les types entiers étendus sont autorisés, mais pas requis. Comme Clang et GCC, Microsoft a choisi de ne pas les implémenter.

[E] Les allocations d'évitement / fusion sont autorisées, mais pas requises. Ici également Microsoft a choisi de ne pas les implémenter.

[F] pris en charge sous / std: c ++ 14 avec "avertissement C4984: 'si constexpr' est une extension de langage C ++ 17". Cela permettra au STL (à l'avenir) d'utiliser "if constexpr" dans sa mise en œuvre.

[14] Ces fonctionnalités sont toujours activées, même sous / std: c ++ 14.

[P2] Ces fonctionnalités ont été enregistrées et seront disponibles dans VS 2017.3 Preview 2.