Nouveautés de C++ dans Visual Studio 2019

Visual Studio 2019 comprend un grand nombre de mises à jour et de correctifs de l’environnement Microsoft C++. Nous avons résolu plusieurs bogues et problèmes dans le compilateur et les outils. Beaucoup de ces problèmes ont été soumis par des clients via les options Signaler un problème et Faire une suggestion sous Envoyer des commentaires. Merci d’avoir signalé ces bogues.

Pour plus d’informations sur l’ensemble des nouveautés de Visual Studio, visitez Nouveautés de Visual Studio 2019. Pour plus d’informations sur les nouveautés de C++ dans Visual Studio 2017, consultez Nouveautés de C++ dans Visual Studio 2017. Pour plus d’informations sur les nouveautés de C++ dans Visual Studio 2015 et versions antérieures, consultez Nouveautés de Visual C++ entre 2003 et 2015. Pour plus d’informations, consultez Documents Microsoft C++ : Nouveautés.

Nouveautés de C++ dans Visual Studio version 16.11

Pour obtenir un résumé des nouvelles fonctionnalités et des correctifs de bogues dans Visual Studio version 16.11, consultez Nouveautés de Visual Studio 2019 version 16.11.

  • Le compilateur prend désormais en charge le mode compilateur /std:c++20. Auparavant, les fonctionnalités C++20 étaient disponibles uniquement en mode /std:c++latest dans Visual Studio 2019. Les fonctionnalités C++20 qui nécessitaient initialement le mode /std:c++latest fonctionnent désormais en mode /std:c++20 ou version ultérieure dans les dernières versions de Visual Studio.

  • Les outils LLVM fournis avec Visual Studio ont été mis à niveau vers LLVM 12. Pour plus d’informations, consultez les notes de publication LLVM.

  • La prise en charge de Clang-cl a été mise à jour vers LLVM 12.

Nouveautés de C++ dans Visual Studio version 16.10

Pour obtenir un résumé des nouvelles fonctionnalités et des correctifs de bogues dans Visual Studio version 16.10, consultez Nouveautés de Visual Studio 2019 version 16.10.

  • Toutes les fonctionnalités C++20 sont désormais disponibles sous /std:c++latest. Bien que l’implémentation par MSVC des normes C++20 (telles qu’actuellement publiées par ISO) soit pleinement fonctionnelle, certaines fonctionnalités clés de la bibliothèque C++20 sont censées être amendées par de prochains rapports de défauts (correctifs de bogues ISO C++20) susceptibles de les modifier d’une manière incompatible avec ABI. Pour plus d’informations, consultez Microsoft/STL Issue #1814.

    • Fonctions immédiates C++20 et prise en charge de constinit ajoutées dans la version 16.10
    • Pièces finales de <chrono>: nouvelles horloges, secondes intercalaires, fuseaux horaires et analyse
    • Implémentation de <format> pour la mise en forme du texte
  • /openmp:llvm est désormais disponible sur x86 et ARM64, en plus de x64

  • Les répertoires Include peuvent désormais être désignés comme externes avec des niveaux d’avertissement de compilation personnalisés et des paramètres d’analyse du code.

  • Ajout de l’option /await:strict pour activer les coroutines de style C++20 dans les modes de langage antérieurs.

  • La visualisation du débogueur de std::coroutine_handle<T> affiche désormais le nom et la signature de la fonction de coroutine d’origine, ainsi que le point de suspension actuel.

  • Ajout de la prise en charge de CMakePresets.

  • Vous devez maintenant accepter ou refuser l’empreinte digitale de la clé hôte présentée par le serveur lors de l’ajout d’une nouvelle connexion à distance dans Visual Studio.

  • Ajout d’un commutateur /external à MSVC pour spécifier des en-têtes qui doivent être traités comme externes à des fins d’avertissement.

Nouveautés de C++ dans Visual Studio version 16.9

Pour obtenir un résumé des nouvelles fonctionnalités et des correctifs de bogues dans Visual Studio version 16.9, consultez Nouveautés de Visual Studio 2019 version 16.9.

  • Assainisseur d’adresse :

    • Notre prise en charge de l’assainisseur d’adresses sur Windows n’est plus au stade expérimental, mais en disponibilité générale.

    • Prise en charge étendue de RtlAllocateHeap, correction d’un problème de compatibilité avec les intercepteurs RtlCreateHeap et RtlAllocateHeap lors de la création de pools de mémoire exécutables.

    • Ajout de la prise en charge des fonctions de famille de mémoire GlobalAlloc et LocalAlloc héritées. Vous pouvez activer ces intercepteurs en définissant l’indicateur d’environnement ASAN_OPTIONS=windows_hook_legacy_allocators=true.

    • Mise à jour des messages pour l’entrelacement et l’interception de la mémoire shadow afin de rendre les problèmes et les résolutions explicites.

    • L’intégration de l’IDE peut désormais gérer la collection complète des exceptions qu’ASan peut signaler.

    • Le compilateur et l’éditeur de liens suggèrent d’émettre des informations de débogage s’ils détectent que vous générez avec ASan mais que vous n’émettez pas d’informations de débogage.

  • Vous pouvez maintenant cibler la version LLVM du runtime OpenMP avec le nouveau commutateur CL /openmp:llvm. Cela ajoute la prise en charge de la clause lastprivate sur les sections #pragma omp, et des variables d’index non signées dans des boucles for parallèles. Le commutateur /openmp:llvm est actuellement uniquement disponible pour la cible amd64 et reste à l’état expérimental.

  • Les projets CMake Visual Studio prennent désormais en charge la première classe pour le développement Windows distant. Cela comprend la configuration d’un projet CMake pour cibler Windows ARM64, le déploiement du projet sur un ordinateur Windows distant, et le débogage du projet sur un ordinateur Windows distant à partir de Visual Studio.

  • La version de Ninja fournie avec Visual Studio sur Windows a été mise à jour vers la version 1.10. Pour plus d’informations sur ce qui est inclus, consultez les notes de publication de Ninja 1.10.

  • La version de CMake fournie avec Visual Studio a été mise à jour vers la version 3.19. Pour plus d’informations sur ce qui est inclus, consultez les notes de publication de CMake 3.19.

  • Marquage de nombreux de types de verrous/protections dans la bibliothèque STL comme nodiscard.

  • IntelliSense :

  • MSVC détermine maintenant les bons runtimes AddressSanitizer requis pour vos binaires. Votre projet Visual Studio bénéficie automatiquement des nouvelles modifications. Lorsque vous utilisez l’assainisseur d’adresse dans la ligne de commande, il vous suffit désormais de passer /fsanitize=address au compilateur.

  • Le gestionnaire de connexions de Visual Studio prend désormais en charge les clés privées à l’aide de l’algorithme à clé publique ECDSA.

  • Mise à jour à v11 des versions de LLVM et Clang fournies dans notre programme d’installation. Pour plus d’informations, lisez les notes de publication de LLVM et Clang.

  • Visual Studio utilise désormais des variables CMake à partir de fichiers de chaîne d’outils pour configurer IntelliSense. Cela permet d’offrir une meilleure expérience pour le développement intégré et Android.

  • Implémentation de la proposition Plus de propositions de conteneurs Constexpr, qui permet aux destructeurs et aux nouvelles expressions d’être constexpr. Cela ouvre la voie aux utilitaires comme constexprstd::vector et std::string.

  • Support étendu des modules C++20 IntelliSense, y compris Atteindre la définition, Accéder au module et Saisie semi-automatique des membres.

  • Les modèles de fonction abrégés sont désormais pris en charge dans le compilateur MSVC.

Nouveautés de C++ dans Visual Studio version 16.8

Pour obtenir un résumé des nouvelles fonctionnalités et des correctifs de bogues dans Visual Studio version 16.8, consultez Nouveautés de Visual Studio 2019 version 16.8.

  • Les coroutines C++20 sont désormais prises en charge sous /std:c++latest (ou /std:c++20 à partir de Visual Studio 2019 version 16.11) et de l’en-tête <coroutine>.

  • IntelliSense prend désormais en charge les en-têtes C++ 20 <concepts> et <ranges>, ainsi que le renommage et la recherche des définitions de concept.

  • Notre STL prend désormais en charge la majorité des plages C++20.

  • Les fonctions membres spéciales conditionnellement triviales sont désormais prises en charge dans MSVC.

  • C11 et C17 sont désormais pris en charge sous les commutateurs /std:c11 et /std:c17 .

  • Parmi les autres améliorations apportées à STL, citons la prise en charge complète pour std::atomic_ref, std::midpoint et std::lerp et std::execution::unseq, optimisations pour std::reverse_copy, etc.

  • Version de CMake mise à jour livrée avec Visual Studio vers CMake 3.18.

  • Nos outils d’analyse du code prennent désormais en charge SARIF 2.1, le format standard pour les journaux d’analyse statique.

  • Si des outils de génération sont manquants dans un projet Linux, un avertissement est désormais généré dans la barre d’outils et une description claire des outil en question apparaît dans la liste d’erreurs.

  • Vous pouvez désormais déboguer les images mémoire Linux sur un système Linux distant ou WSL directement à partir de Visual Studio.

  • Pour la génération de commentaires Doxygen pour C++, nous avons ajouté des options de style de commentaire (/*! et //!).

  • Autres annonces sur vcpkg.

  • Support du compilateur pour des expressions lambda dans des contextes non évalués.

  • Performances des liens /DEBUG:FULL améliorées par la création d’un fichier PDB multi-threading. Plusieurs applications de grande taille et jeux AAA voient une liaison de 2 à 4 fois plus rapide.

  • Le débogueur Visual Studio prend désormais en charge char8_t.

  • Support des projets ARM64 à l’aide de clang-cl.

  • Support Intel AMX intrinsèque.

Nouveautés de C++ dans Visual Studio version 16.7

Pour obtenir un résumé des nouvelles fonctionnalités et des correctifs de bogues dans Visual Studio version 16.7, consultez Nouveautés de Visual Studio 2019 version 16.7.

  • Notre prise en charge de C++ à distance accepte désormais une gamme plus étendue de distributions et shells Linux, notamment sh, csh, bash, tsch, ksh, zsh et dash. Vous pouvez remplacer le choix d’un shell pour une connexion à distance en modifiant la nouvelle propriété « shell » via ConnectionManager.exe. Cette prise en charge a été testée avec des projets Linux basés sur MSBuild et des projets CMake ciblant un système Linux distant ou WSL.

  • Vous pouvez maintenant utiliser Ninja (un système de génération qui évalue très rapidement les builds incrémentielles) afin d’améliorer les temps de génération incrémentielle pour les projets Linux basés sur MSBuild. Vous pouvez choisir cette fonctionnalité en affectant à « Activer la build incrémentielle » la valeur « Avec Ninja » dans la page de propriétés Général. Ninja (ninja-build) doit être installé sur votre système Linux distant ou WSL.

  • Les nouvelles fonctionnalités de bibliothèque standard C++20 ont été implémentées. Pour obtenir une liste détaillée, consultez Journal des modifications STL sur GitHub.

  • Vous pouvez maintenant modifier et définir des connexions SSH à distance par défaut dans le Gestionnaire des connexions. Cela signifie que vous pouvez modifier une connexion à distance existante (par exemple, si son adresse IP a changé) et définir des connexions par défaut à consommer dans CMakeSettings.json et launch.vs.json. Les connexions SSH à distance vous permettent de générer et de déboguer des projets C++ sur un système Linux distant directement à partir de Visual Studio.

  • Prise en charge améliorée d’IntelliSense pour Clang sur Windows (Clang-CL) dans Visual Studio. Le chemin clang include inclut maintenant les bibliothèques clang, nous avons amélioré l’affichage des tildes dans l’éditeur lors de l’utilisation de la bibliothèque std, et nous avons ajouté la prise en charge de C++2a en mode clang.

  • Vous pouvez maintenant essayer le soulignement des erreurs de code et voir plus de suggestions de correctifs rapides dans les projets C ++. Activez cette fonctionnalité sous Outils > Options > Éditeur de texte > C/C++ > Expérimental. Définissez Désactiver le linter du code expérimental sur false. Pour en savoir plus, consultez le blog de l’équipe C++.

  • Nous avons ajouté quatre nouvelles règles d’analyse du code pour incorporer des fonctionnalités de sécurité supplémentaires dans C++ : C26817, C26818, C26819 et C26820.

  • Nous avons ajouté une prise en charge de premier ordre pour le débogage des projets CMake sur des systèmes distants avec gdbserver.

  • Recherchez facilement les erreurs d’altération de la mémoire avec une implémentation expérimentale d’AddressSanitizer pour C++ dans Visual Studio, désormais disponible pour les projets x64 natifs. Nous prenons également en charge l’utilisation des runtimes de débogage (/MTd, /MDd, /LDd).

  • IntelliSense offre désormais une prise en charge de base pour les concepts, les initialiseurs désignés et plusieurs autres fonctionnalités de C++20.

  • Les fichiers .ixx et .cppm sont désormais reconnus comme étant du C++, et sont traités comme tels par le surligneur de syntaxe et par IntelliSense.

Nouveautés de C++ dans Visual Studio version 16.6

Pour obtenir un résumé des nouvelles fonctionnalités et des correctifs de bogues dans Visual Studio version 16.6, consultez Nouveautés de Visual Studio 2019 version 16.6.

  • Amélioration de la génération de commentaires Doxygen/XML : générez automatiquement des stubs de commentaires de document Doxygen ou XML en tapant /// ou /** au-dessus des fonctions. Ils sont désormais également affichés dans des info-bulles Info express.

  • Prise en charge de Ninja pour CMake pour Linux/WSL : Utilisez Ninja comme générateur sous-jacent lors de la création de projets CMake sur WSL ou un système distant. Ninja est désormais le générateur par défaut lors de l’ajout d’une nouvelle configuration Linux ou WSL.

  • Modèles de débogage pour le débogage de CMake à distance : Nous avons simplifié les modèles de débogage des projets CMake sur un système Linux distant ou WSL avec gdb.

  • Prise en charge initiale des concepts C++20 : IntelliSense reconnaît désormais les concepts C++20 et les suggère dans la liste des membres.

Nouveautés de C++ dans Visual Studio version 16.5

Pour obtenir un résumé des nouvelles fonctionnalités et des correctifs de bogues dans Visual Studio version 16.5, consultez Nouveautés de Visual Studio 2019 version 16.5.

  • Prise en charge des variables de modèle et des variables membres de Complétions d’équipe IntelliCode : les développeurs C++ peuvent désormais entraîner des modèles IntelliCode sur leurs propres codes base. Nous appelons cela un modèle de complétions d’équipe, car vous bénéficiez des pratiques de votre équipe. En outre, nous avons amélioré les suggestions IntelliCode pour les variables membres.

  • Améliorations d’IntelliSense :

    • IntelliSense affiche désormais des noms de types plus lisibles lors de l’utilisation de la bibliothèque standard.
    • Nous avons ajouté la possibilité de choisir entre Entrée, Espace et Tabulation pour fonctionner comme caractères de validation, et de choisir si Tabulation est utilisé pour Insérer un extrait de code. Vous pouvez trouver ces paramètres sous Outils > Options > Éditeur de texte > C/C++ > Avancé > IntelliSense.
  • Gestionnaire de connexions sur la ligne de commande : vous pouvez désormais interagir avec vos connexions à distance stockées sur la ligne de commande. C’est utile pour des tâches comme le provisionnement d’une nouvelle machine de développement ou la configuration de Visual Studio dans l’intégration continue.

  • Déboguer et déployer pour WSL : utilisez la prise en charge native de Visual Studio pour WSL afin de séparer votre système de génération de votre système de déploiement à distance. Vous pouvez désormais générer en mode natif sur WSL et déployer des artefacts de build sur un second système distant à des fins de débogage. Ce workflow est pris en charge par les projets CMake et les projets Linux basés sur MSBuild.

  • Prise en charge du mode de conformité FIPS 140-2 : Visual Studio prend désormais en charge le mode de conformité FIPS 140-2 lors du développement d’applications C++ qui ciblent un système Linux distant.

  • Services de langage pour les fichiers de langage CMake et meilleure manipulation des projets CMake :

    • La copie du fichier source pour les projets CMake ciblant un système Linux distant a été optimisée. Visual Studio conserve désormais un « fichier d’empreinte digitale » du dernier ensemble de sources copiées à distance et optimise le comportement en fonction du nombre de fichiers qui ont été modifiés.

    • Les fonctionnalités de navigation dans le code, comme Atteindre la définition et Rechercher toutes les références sont désormais prises en charge pour les fonctions, les variables et les cibles dans les fichiers de script CMake.

    • Ajoutez, supprimez et renommez les fichiers sources et les cibles dans vos projets CMake à partir de l’IDE sans modifier manuellement vos scripts CMake. Quand vous ajoutez ou supprimez des fichiers avec l’Explorateur de solutions, Visual Studio modifie automatiquement votre projet CMake. Vous pouvez également ajouter, supprimer et renommer les cibles du projet à partir de l’affichage des cibles de l’Explorateur de solutions.

  • Améliorations de projets Linux : les projets Visual Studio Linux disposent désormais d’un IntelliSense plus précis et vous permettent de contrôler la synchronisation des en-têtes distants d’une base projet par projet.

Nouveautés de C++ dans Visual Studio version 16.4

Pour obtenir un résumé des nouvelles fonctionnalités et des correctifs de bogues dans Visual Studio version 16.4, consultez Nouveautés de Visual Studio 2019 version 16.4.

  • L’analyse du code prend désormais en charge Clang-Tidy en mode natif pour les projets MSBuild et CMake, que vous utilisiez l’ensemble d’outils Clang ou MSVC. Les vérifications Clang-Tidy peuvent être exécutées dans le cadre de l'analyse du code d'arrière-plan, apparaître sous forme d'avertissements dans l'éditeur (soulignements ondulés) et s'afficher dans la Liste d'erreurs.

  • Les projets Visual Studio CMake comprennent désormais des pages de vue d’ensemble qui vous permettent de bien démarrer avec le développement multiplateforme. Ces pages sont dynamiques et vous permettent de vous connecter à un système Linux et d’ajouter une configuration Linux ou WSL à votre projet CMake.

  • Le menu déroulant de lancement des projets CMake affiche désormais les cibles les plus récemment utilisées et vous permet de les filtrer.

  • C++ et l’interface CLI prennent désormais en charge l’interopérabilité avec .NET Core 3.1 et versions ultérieures sur Windows.

  • Vous pouvez désormais activer ASan pour les projets compilés avec MSVC sur Windows pour l’instrumentation du runtime du code C++ qui permet de détecter les erreurs de mémoire.

  • Mises à jour de la bibliothèque C++ standard de MSVC :

    • C++17 : Implémentation de la précision générale to_chars(), en installant des conversions de chaînes élémentaires P0067R5 (charconv). Cela termine l’implémentation de toutes les fonctionnalités de la bibliothèque dans la norme C++17.
    • C++20 : Implémentation de concepts de changement de nom P1754R1 en standard_case. Pour inclure ces fonctionnalités, utilisez l’option du compilateur /std:c++latest (ou /std:c++20 à partir de Visual Studio 2019 version 16.11). L’option peut également être définie dans la page de propriétés de projet Propriétés de configuration > C/C++ > Langage en utilisant la propriété Norme du langage C++.
  • Une nouvelle collection d’outils nommée C++ Build Insights est désormais disponible. Pour plus d’informations sur l’annonce, consultez le Blog de l’équipe C++.

Nouveautés de C++ dans Visual Studio version 16.3

Pour obtenir un résumé des nouvelles fonctionnalités et des correctifs de bogues dans Visual Studio version 16.3, consultez Nouveautés dans Visual Studio 2019 version 16.3.

  • Les développeurs C++ peuvent maintenant activer/désactiver les commentaires de ligne à l’aide du raccourci clavier Ctrl+K, Ctrl+/.

  • Les listes des membres IntelliSense sont maintenant filtrées en fonction des qualificateurs de type. Par exemple, const std::vector filtre désormais les méthodes comme push_back.

  • Nous avons ajouté les fonctionnalités de Bibliothèque standard C++20 suivantes (disponibles sous /std:c++latest, ou /std:c++20 à partir de Visual Studio 2019 version 16.11) :

    • P0487R1 : Résolution operator>>(basic_istream&, CharT*)
    • P0616R0 : À l’aide de move() dans <numeric>
    • P0758R1 : is_nothrow_convertible
    • P0734R0 : Extensions C++ pour concepts
    • P0898R3 : Concepts de bibliothèque standard
    • P0919R3 : Recherche hétérogène pour les conteneurs non ordonnés
  • Nouvelles vérifications C++ des instructions de base, incluant le nouvel ensemble de règles « Enum Rules » ainsi que des règles const, enum et de type. supplémentaires.

  • Un nouveau schéma de colorisation sémantique par défaut permet aux utilisateurs de mieux comprendre leur code, la fenêtre de la pile des appels peut être configurée pour masquer les arguments de modèle et IntelliCode C++ est activé par défaut.

  • Configurez des cibles de débogage et des tâches personnalisées avec des variables d’environnement à l’aide de CMakeSettings.json, de CppProperties.json ou de la nouvelle balise « env » sur des cibles et des tâches individuelles dans launch.vs.json et tasks.vs.json.

  • Les utilisateurs peuvent désormais effectuer une action rapide sur les packages vcpkg manquants pour ouvrir automatiquement une console et l’installer par défaut sur vcpkg.

  • La copie d’en-tête distant effectuée par les projets Linux (CMake et MSBuild) a été optimisée et s’exécute désormais en parallèle.

  • Les prises en charge natives pour WSLC de Visual Studio prennent désormais en charge les builds parallèles pour les projets Linux basés sur MSBuild.

  • Les utilisateurs peuvent désormais indiquer une liste de sorties de builds locales à déployer sur un système distant avec des projets Makefile Linux.

  • Les descriptions indiquées dans les paramètres de l’éditeur de paramètres CMake contiennent désormais davantage de contexte et de liens vers une documentation utile.

  • Le modèle de base C++ pour IntelliCode est désormais activé par défaut. Vous pouvez changer ce paramètre en accédant à Outils>Options>IntelliCode.

Nouveautés de C++ dans Visual Studio version 16.2

Pour obtenir un résumé des nouvelles fonctionnalités et des correctifs de bogues dans Visual Studio version 16.2, consultez Nouveautés dans Visual Studio 2019 version 16.2.

  • Pour les projets CMake locaux configurés avec Clang, l’analyse du code exécute désormais des vérifications clang-tidy, apparaissant dans le cadre de l’analyse de code en arrière-plan comme des avertissements dans l’éditeur (tildes) et dans la liste d’erreurs.

  • Mise à jour de l’en-tête <charconv> pour les conversions des chaînes élémentaires P0067R5 de C++17 :

    • Ajout de surcharges to_chars() à virgule flottante pour la précision chars_format::fixed et chars_format::scientific (chars_format::general precision est la seule partie qui n’est pas encore implémentée)
    • Optimisation du chars_format::fixed le plus court
  • Ajout des fonctionnalités suivantes de la Bibliothèque standard C++20 :

    • Disponible sous /std:c++latest (ou /std:c++20 à partir de Visual Studio 2019 version 16.11) :
      • P0020R6 : atomic<floating-point>
      • P0463R1 : énumération endian
      • P0482R6 : type char8_t pour les caractères et les chaînes UTF-8
      • P0653R2 : to_address() pour convertir un pointeur vers un pointeur brut
    • Disponible sous /std:c++17 et /std:c++latest (ou /std:c++20 à partir de Visual Studio 2019 version 16.11) :
      • P0600R1 : [[nodiscard]] dans la bibliothèque
    • Disponible sans condition :
      • P0754R2 : En-tête <version>
      • P0771R1 : Le constructeur de déplacement de std::function doit être noexcept
  • Le SDK Windows n’est plus une dépendance des composants CMake pour Windows et CMake pour Linux.

  • Améliorations apportées à l’éditeur de liens C++ pour réduire de manière significative les temps de build des itérations pour la plus grande entrée. Les temps /DEBUG:FAST et /INCREMENTAL sont en moyenne deux fois plus rapides, et le temps /DEBUG:FULL est désormais trois à six fois plus rapide.

Nouveautés de C++ dans Visual Studio version 16.1

Pour obtenir un résumé des nouvelles fonctionnalités et des correctifs de bogues dans Visual Studio version 16.1, consultez Nouveautés dans Visual Studio 2019 version 16.1.

compilateur C++

  • Les fonctionnalités C++20 suivantes ont été implémentées dans le compilateur C++. Elles disponibles sous /std:c++latest (ou /std:c++20 à partir de Visual Studio 2019 version 16.11) :

    • Possibilité accrue de trouver des modèles de fonctions par le biais d’une recherche dépendante d’un argument pour les expressions d’appel de fonction avec des arguments de modèle explicites (P0846R0).
    • Initialisation désignée (P0329R4), ce qui permet la sélection de membres spécifiques dans l’initialisation d’agrégats, par exemple à l’aide de la syntaxe Type t { .member = expr }.
  • La prise en charge de lambda a été repensée, résolvant un grand nombre de bogues de longue date. Ce changement est activé par défaut quand vous utilisez /std:c++20 ou /std:c++latest. En mode de langage /std:c++17 et en mode par défaut (/std:c++14), le nouvel analyseur peut être activé à l’aide de /Zc:lambda dans Visual Studio 2019 versions 16.9 ou ultérieures (précédemment disponible en tant que /experimental:newLambdaProcessor à partir de Visual Studio 2019 version 16.3), par exemple, /std:c++17 /Zc:lambda.

Améliorations apportées à la bibliothèque standard C++

  • Les fonctionnalités C++20 suivantes ont été ajoutées à notre implémentation de la Bibliothèque standard C++, disponible sous /std:c++latest :
    • starts_with et ends_with pour basic_string et basic_string_view.
    • contains pour les conteneurs associatifs.
    • remove, remove_if et unique pour list et forward_list retournent maintenant size_type.
    • shift_left et shift_right ajoutés à <algorithm>.

IDE C++

IntelliCode pour C++

IntelliCode est désormais fourni en tant que composant facultatif dans la charge de travail Développement Desktop en C++. Pour en savoir plus, voir IntelliCode C++ amélioré désormais fourni avec Visual Studio 2019.

IntelliCode exploite toutes ses données d’apprentissage et le contexte de votre code pour suggérer les éléments de code que vous êtes le plus susceptible d’utiliser en haut de votre liste de complétion. Il peut souvent vous éviter de faire défiler la liste vers le bas. Pour C++, IntelliCode est le plus performant quand vous utilisez des bibliothèques courantes comme la bibliothèque standard.

Les nouvelles fonctionnalités IntelliCode (modèles personnalisés, prise en charge de C++ et inférence EditorConfig) sont désactivées par défaut. Pour les activer, accédez à Outils > Options > IntelliCode > Général. Cette version d’IntelliCode offre une meilleure précision et inclut la prise en charge de fonctions gratuites. Pour plus d’informations, consultez AI-Assisted Code Completion Suggestions Come to C++ via IntelliCode.

Améliorations des informations rapides

  • L’info-bulle Info express respecte désormais la colorisation sémantique de votre éditeur. Il dispose également d’un nouveau lien de Recherche en ligne qui recherche de la documentation en ligne sur la construction de code survolé. Le lien fourni par Info express pour le code souligné en rouge permet de rechercher l’erreur en ligne. Ainsi, vous n’avez pas besoin de retaper le message dans votre navigateur. Pour en savoir plus, consultez la section relative aux améliorations de Info express dans Visual Studio 2019 : Colorisation et recherche en ligne.

Améliorations générales

  • La barre de modèle peut remplir le menu déroulant à partir des instanciations de ce modèle dans votre codebase.

  • Ampoules signalant des directives #include manquantes que vcpkg peut installer, et saisie semi-automatique des packages disponibles pour la directive CMake find_package.

  • La page de propriétés Générales pour les projets C++ a été revue. Certaines options sont désormais répertoriées sous une nouvelle page Avancées . La page Avancées inclut également des propriétés supplémentaires pour vos architecture d’ensemble d’outils, bibliothèques de débogage, version mineure de l’ensemble d’outils MSVC et builds Unity (jumbo) préférées.

Prise en charge de CMake

  • Nous avons mis à jour de la version de CMake qui est fournie avec Visual Studio vers la version 3.14. Cette version ajoute la prise en charge intégrée des générateurs MSBuild ciblant les projets Visual Studio 2019 ainsi que les API d’intégration de l’IDE basées sur des fichiers.

  • Nous avons apporté des améliorations à l’Éditeur de paramètres CMake, notamment la prise en charge du sous-système Windows pour Linux (WSL) et les configurations de caches existants, les changements apportés aux racines de génération et d’installation par défaut, ainsi que la prise en charge de variables d’environnement dans les configurations CMake Linux.

  • Les saisies semi-automatiques et les informations express des commandes, variables et propriétés CMake intégrées facilitent la modification de vos fichiers CMakeLists.txt.

  • Nous avons intégré la prise en charge pour la modification, la génération et le débogage de projets CMake avec Clang/LLVM. Pour en savoir plus, voir Prise en charge Clang/LLVM dans Visual Studio.

Linux et le sous-système Windows pour Linux

Analyse du code

Builds distantes

  • Les utilisateurs peuvent maintenant séparer les machines de build distantes des machines de débogage distantes sur Linux, dans les projets MSBuild et CMake.

  • L’amélioration de la journalisation des connexions à distance facilite le diagnostic des problèmes dans le cadre du développement multiplateforme.

Nouveautés de C++ dans Visual Studio version 16.0

Pour obtenir un résumé des nouvelles fonctionnalités et des correctifs de bogues dans Visual Studio version 16.0, consultez Nouveautés dans Visual Studio 2019 version 16.0.

compilateur C++

  • Une prise en charge améliorée des fonctionnalités et correctifs d’exactitude C++17, plus une prise en charge expérimentale de fonctionnalités C++20 comme les modules et les coroutines. Pour plus d’informations, consultez Améliorations de la conformité de C++ dans Visual Studio 2019.

  • L’option /std:c++latest inclut désormais les fonctionnalités de C++20 qui ne sont pas nécessairement complètes, notamment la prise en charge initiale de l’opérateur C++20 <=> (« spaceship ») pour une comparaison triple.

  • Le commutateur /Gm du compilateur C++ est maintenant déprécié. Envisagez de désactiver le commutateur /Gm dans vos scripts de build s’il y est défini explicitement. Vous pouvez cependant ignorer sans problème l’avertissement de dépréciation de /Gm, car il n’est pas traité en tant qu’erreur quand vous utilisez « Considérer les avertissements comme des erreurs » (/WX).

  • Comme MSVC commence la mise en œuvre de fonctionnalités à partir du brouillon standard C++20 sous l’indicateur /std:c++latest, /std:c++latest est désormais incompatible avec /clr (toutes les saveurs), /ZW, et /Gm. Dans Visual Studio 2019, utilisez le mode /std:c++17 ou /std:c++14 lors de la compilation avec /clr, /ZW ou /Gm (consultez la liste à puces précédente).

  • Les en-têtes précompilés ne sont plus générés par défaut pour les applications de bureau et console C++.

Codegen, sécurité, diagnostics et gestion des versions

Analyse améliorée avec /Qspectre afin de fournir une aide à l’atténuation des risques pour Spectre Variant 1 (CVE-2017-5753). Pour plus d’informations, consultez Spectre Mitigations in MSVC.

Améliorations apportées à la bibliothèque standard C++

  • Implémentation de nouvelles fonctionnalités de bibliothèque et de nouveaux correctifs d’exactitude C++17 et C++20. Pour plus d’informations, consultez Améliorations de la conformité de C++ dans Visual Studio 2019.

  • Le format clang a été appliqué aux en-têtes de la bibliothèque standard C++ pour une meilleure lisibilité.

  • Étant donné que Visual Studio prend désormais en charge Uniquement mon code pour C++, la bibliothèque standard n’a plus besoin de fournir de mécanisme personnalisé pour std::function et std::visit pour obtenir le même effet. La suppression de ce mécanisme n’aura quasiment aucun effet visible par l’utilisateur. Une exception est que le compilateur ne produira plus de diagnostics indiquant les problèmes de ligne 15732480 ou 16707566 de <type_traits> ou <variant>.

Améliorations de performances/débit dans le compilateur et la bibliothèque standard

  • Améliorations du débit de la génération, notamment la gestion par l’éditeur de liens des E/S de fichier, et la durée de l’établissement des liens dans la création et la fusion des types PDB.

  • Ajout de la prise en charge de base de la vectorisation SIMD OpenMP. Vous pouvez l’activer avec le nouveau commutateur de compilateur /openmp:experimental. Cette option permet la vectorisation potentielle des boucles annotées avec #pragma omp simd. La vectorisation n’est pas garantie, et les boucles annotées mais pas vectorisées génèrent un avertissement. Aucune clause SIMD n’est prise en charge ; elles sont ignorées et un avertissement est émis.

  • Ajout d’un nouveau commutateur de ligne de commande d’incorporation (inlining) /Ob3, qui est une version plus agressive de /Ob2. /O2 (optimiser le fichier binaire pour la vitesse) implique toujours /Ob2 par défaut. Si vous trouvez que le compilateur n’incorpore pas de façon suffisamment agressive, envisagez de passer /O2 -Ob3.

  • Nous avons ajouté la prise en charge des fonctions intrinsèques SVML (Short Vector Math Library). Ces fonctions calculent les vecteurs équivalents 128 bits, 256 bits ou 512 bits. Nous les avons ajoutées pour prendre en charge la vectorisation manuelle de boucles avec des appels aux fonctions de bibliothèque mathématique, et certaines autres opérations comme la division entière. Pour obtenir les définitions des fonctions prises en charge, consultez le Guide des intrinsèques Intel.

  • Optimisations nouvelles et améliorées :

    • Simplifications arithmétiques et de pliage de constante pour les expressions à l’aide d’intrinsèques de vecteur SIMD, pour les formes float et integer.

    • Analyse plus puissante pour extraire des informations de flux de contrôle (instructions if/else/switch) afin de supprimer les branches toujours prouvées comme étant true ou false.

    • Amélioration du déroulement de memset de façon à utiliser les instructions de vecteur SSE2.

    • Amélioration de la suppression des copies de struct/classes inutiles, en particulier pour les programmes C++ qui passent par valeur.

    • Amélioration de l’optimisation du code utilisant memmove, comme std::copy ou std::vector et une construction std::string.

  • Optimisez la conception physique de la bibliothèque standard afin d’éviter de compiler des parties de la bibliothèque standard qui ne sont pas directement incluses. Cette modification réduit le temps de génération d’un fichier vide qui inclut uniquement <vector> de moitié. En conséquence, vous devrez peut-être ajouter des directives #include pour les en-têtes qui précédemment étaient indirectement inclus. Par exemple, le code qui utilise std::out_of_range pourrait maintenant avoir à ajouter #include <stdexcept>. Le code qui utilise un opérateur d’insertion de flux doit maintenant ajouter #include <ostream>. L’avantage est que seule les unités de traduction qui utilisent réellement des composants <stdexcept> ou <ostream> payent le débit de coût pour les compiler.

  • if constexpr a été appliqué à plusieurs endroits dans la bibliothèque standard pour un débit amélioré et une taille de code réduite dans les opérations de copie, dans les permutations comme l’inversion et la rotation et dans la bibliothèque d’algorithmes parallèles.

  • La bibliothèque standard utilise désormais if constexpr en interne afin de réduire la compilation même en mode C++14.

  • La détection de lien dynamique de runtime pour la bibliothèque d’algorithmes parallèles n’utilise plus une page entière pour stocker le tableau de pointeurs de fonction. Le marquage de cette mémoire en lecture seule n’est plus considéré comme pertinent pour des raisons de sécurité.

  • Le constructeur de std::thread n’attend plus que le thread démarre, et n’insère plus autant de calques d’appels de fonction entre la bibliothèque C sous-jacente _beginthreadex et l’objet fourni pouvant être appelé. Auparavant std::thread mettait six fonctions entre _beginthreadex et l’objet pouvant être appelé fourni. Ce nombre a été réduit à trois, dont deux sont justes std::invoke. Ce changement résout également un bogue obscur de minutage ou un constructeur std::thread cessait de répondre si l’horloge du système changeait au moment précis où le std::thread était créé.

  • Correction d’une régression des performances dans std::hash que nous avons introduit lors de l’implémentation std::hash<std::filesystem::path>.

  • La bibliothèque standard utilise désormais dans plusieurs endroits, des destructeurs au lieu de blocs catch pour atteindre l’exactitude. Le résultat de cette modification est une meilleure interaction du débogueur ; les exceptions que vous levez via la bibliothèque standard dans les emplacements concernés apparaissent désormais comme ayant été levés à partir de leur site de levée d’origine, plutôt que d’une nouvelle levée. Les blocs catch de bibliothèque standard n’ont pas tous été éliminés. Nous nous attendons à ce que le nombre de blocs catch soit réduit dans les versions ultérieures de MSVC.

  • Un codegen non optimal dans std::bitset provoqué par une levée conditionnelle à l’intérieur d’une fonction noexcept a été résolu en factorisant le chemin d’accès levant.

  • Les familles std::list et std::unordered_* utilisent des itérateurs de non débogage en interne dans plusieurs endroits.

  • Plusieurs membres std::list ont été modifiés pour réutiliser les nœuds de la liste lorsque cela est possible au lieu de les libérer et de les redistribuer. Par exemple, dans le cas d’un list<int> qui possède déjà une taille de 3, un appel à assign(4, 1729) remplace maintenant les valeurs int dans les trois premiers nœuds de la liste et alloue un nouveau nœud de liste avec la valeur 1729.

  • Tous les appels de la bibliothèque standard à erase(begin(), end()) ont été remplacés par clear().

  • std::vector initialise et efface désormais les éléments plus efficacement dans certains cas.

  • Améliorations apportées à std::variant pour le rendre plus adapté à l’optimiseur, ce qui entraîne la génération d’un meilleur code. L’incorporation (inlining) de code est désormais bien meilleure avec std::visit.

IDE C++

Prise en charge de C++ par Live Share

Live Share prend désormais en charge C++, ce qui permet aux développeurs utilisant Visual Studio ou Visual Studio Code de collaborer en temps réel. Pour plus d’informations, consultez Announcing Live Share for C++: Real-Time Sharing and Collaboration

Modèle IntelliSense

La barre de modèles utilise maintenant l’interface utilisateur de la fenêtre d’aperçu au lieu d’une fenêtre modale, prend en charge les modèles imbriqués et prérenseigne les arguments par défaut dans la fenêtre d’aperçu. Pour plus d’informations, consultez Template IntelliSense Improvements for Visual Studio 2019 Preview 2. Une liste déroulante Utilisés le plus récemment dans la barre de modèles vous permet de basculer rapidement entre des ensembles antérieurs d’exemples d’arguments.

Nouvelle fenêtre de démarrage

Lors du lancement de l’IDE, une nouvelle fenêtre Démarrer s’affiche. Elle contient des options pour ouvrir des projets récents, cloner le code à partir du contrôle de code source, ouvrir du code local en tant que solution ou dossier, ou créer un projet. La boîte de dialogue Nouveau projet a également été repensée pour permettre une expérience de recherche en premier avec possibilité de filtrage.

Nouveaux noms pour certains modèles de projet

Nous avons renommé plusieurs noms de modèles de projet et changé certaines descriptions en raison de la mise à jour de la boîte de dialogue Nouveau projet.

Différentes améliorations de la productivité

Visual Studio 2019 inclut les fonctionnalités suivantes qui rendent le codage plus facile et plus intuitif :

  • Corrections rapides pour :
    • Ajouter un #include manquant
    • Il lance NULL sur nullptr.
    • Ajouter un point-virgule manquant
    • Résoudre l’absence d’un espace de noms ou d’une étendue
    • Remplacer les opérandes d’indirection incorrects (* en & et & en *)
  • Info express pour un bloc en plaçant le curseur sur l’accolade fermante
  • Afficher un aperçu de l’en-tête / du fichier de code
  • Atteindre la définition sur un #include ouvre le fichier

Pour plus d’informations, consultez C++ Productivity Improvements in Visual Studio 2019 Preview 2.

Prise en charge de CMake

  • Prise en charge de CMake 3.14

  • Visual Studio peut maintenant ouvrir les caches CMake existants générés par des outils externes, comme CMakeGUI, des systèmes de génération de métadonnées personnalisés ou des scripts de génération appelant eux-mêmes cmake.exe.

  • Amélioration des performances d’IntelliSense.

  • Un nouvel éditeur de paramètres fournit une alternative à la modification manuelle de CMakeSettings.json et offre une similarité avec CMakeGUI.

  • Visual Studio vous aide à démarrer votre développement en C++ avec CMake sur Linux en détectant si vous avez une version compatible de CMake sur votre ordinateur Linux. Si ce n’est pas le cas, il propose de l’installer pour vous.

  • Les paramètres incompatibles dans CMakeSettings, comme les incompatibilités d’architectures ou les paramètres de générateur CMake incompatibles, sont marqués par des tildes dans l’éditeur JSON et par des erreurs dans la liste d’erreurs.

  • La chaîne d’outils vcpkg est automatiquement détectée et activée pour les projets CMake qui sont ouverts dans l’IDE, une fois que vcpkg integrate install a été exécuté. Ce comportement peut être désactivé en spécifiant un fichier de chaîne d’outils vide dans cmakesettings.

  • Les projets CMake autorisent maintenant le débogage Uniquement mon code par défaut.

  • Les avertissements d’analyse statique sont désormais traités en arrière-plan et affichés dans l’éditeur pour les projets CMake.

  • Messages de début et de fin de génération et de configuration plus clairs pour les projets CMake, et prise en charge de l’interface utilisateur de progression de la génération de Visual Studio. De plus, il existe désormais un paramètre de niveau de détail CMake dans Outils > Options pour personnaliser le niveau de détail des messages de génération et de configuration CMake dans la fenêtre Sortie.

  • Le paramètre cmakeToolchain est désormais pris en charge dans CMakeSettings.json pour spécifier des chaînes d’outils sans modifier manuellement la ligne de commande CMake.

  • Nouveau raccourci pour le menu Tout générer (Ctrl+Maj+B).

Intégration d’IncrediBuild

IncrediBuild est désormais fourni en tant que composant facultatif dans la charge de travail Développement Desktop en C++. Le moniteur de build IncrediBuild est entièrement intégré à l’IDE de Visual Studio. Pour en savoir plus, voir Visualiser votre build avec le moniteur de build d’IncrediBuild et Visual Studio 2019.

Débogage

  • Pour les applications C++ exécutées sur Windows, les fichiers PDB se chargent désormais dans un processus 64 bits distinct. Cette modification traite d’une plage d’incidents provoqués par le débogueur à court de mémoire. Par exemple, lors du débogage d’applications qui contiennent un grand nombre de modules et de fichiers PDB.

  • La recherche est activée dans les fenêtres Espion, Autos, et Variables locales.

Développement Windows Desktop avec C++

  • Ces Assistants C++ ATL/MFC suivants ne sont plus disponibles :

    • Assistant Composant COM+ 1.0 ATL
    • Assistant Composant ASP ATL
    • Assistant Fournisseur OLEDB ATL
    • Assistant Page de propriétés ATL
    • Assistant Consommateur OLEDB ATL
    • Consommateur ODBC MFC
    • Classe MFC à partir d’un contrôle ActiveX
    • Classe MFC à partir d’une bibliothèque de types.

    Les exemples de code pour ces technologies sont archivés dans Microsoft Learn et dans le dépôt GitHub VCSamples.

  • Le Kit de développement logiciel (SDK) Windows 8.1 n’est plus disponible dans le programme d’installation de Visual Studio. Nous vous recommandons de mettre à niveau vos projets C++ vers la dernière version du SDK Windows. Si vous avez une dépendance dure envers la version 8.1, vous pouvez la télécharger à partir de l’archive du SDK Windows.

  • Le ciblage de Windows XP ne sera plus disponible pour le dernier ensemble d’outils C++. Le ciblage de XP avec des bibliothèques et le compilateur MSVC de niveau Visual Studio 2017 est toujours pris en charge et peut être installé par le biais de « Composants individuels ».

  • Notre documentation décourage activement l’utilisation de Fusionner les modules pour le déploiement Visual C++ Runtime. Dans cette version, nous allons encore un peu plus loin en marquant nos MSM comme étant dépréciés. Envisagez la migration de votre déploiement central VCRuntime des MSM vers le package redistribuable.

Développement mobile en C++ (Android et iOS)

L’expérience Android C++ utilise désormais Android SDK 25 et Android NDK 16b par défaut.

Ensemble d’outils de plateforme Clang/C2

Le composant expérimental Clang/C2 a été supprimé. Utilisez l’ensemble d’outils MSVC pour garantir une totale conformité aux standards C++ avec /permissive- et /std:c++17, ou la chaîne d’outils Clang/LLVM pour Windows.

Analyse du code

Test des unités

Le modèle de projet de test C++ managé n’est plus disponible. Vous pouvez continuer à utiliser le framework de test C++ managé dans vos projets existants. Pour les nouveaux tests unitaires, utilisez un des frameworks de test natifs pour lesquels Visual Studio fournit des modèles (MSTest, Google Test) ou le modèle de projet de test C# managé.