Novedades de C++ en Visual Studio 2019

Visual Studio 2019 incluye muchas actualizaciones y revisiones del entorno de Microsoft C++. Se han corregido muchos errores y problemas en el compilador y las herramientas. Muchos de estos problemas fueron enviados por los clientes mediante las opciones Notificar un problema y Aportar una sugerencia en Enviar comentarios. ¡Muchas gracias por notificárnoslos!

Para más información sobre todas las novedades de Visual Studio, visite Novedades de Visual Studio 2019. Para información sobre las novedades de C++ en Visual Studio 2017, consulte Novedades de C++ en Visual Studio 2017. Para información sobre las novedades de C++ en Visual Studio 2015 y versiones anteriores, consulte Novedades de Visual C++ de 2003 a 2015. Para obtener más información, consulte Documentación de Microsoft C++: novedades.

Novedades de C++ en Visual Studio, versión 16.11

Para obtener un resumen de las nuevas características y las correcciones de errores de Visual Studio 2019, versión 16.11, consulte Novedades de Visual Studio 2019, versión 16.11.

  • El compilador ahora admite el modo de compilador de /std:c++20. Anteriormente, las características de C++20 solo estaban disponibles en el modo /std:c++latest de Visual Studio 2019. Las características que originalmente requerían el modo /std:c++latest ahora funcionan en el modo /std:c++20 o posterior en las versiones más recientes de Visual Studio.

  • Las herramientas de LLVM que se incluyen con Visual Studio se han actualizado a LLVM 12. Para obtener los detalles, consulte las notas de la versión de LLVM.

  • La compatibilidad con Clang-cl se actualizó a LLVM 12.

Novedades de C++ en Visual Studio, versión 16.10

Para obtener un resumen de las nuevas características y las correcciones de errores de la versión 16.10 de Visual Studio, consulte Novedades de Visual Studio 2019, versión 16.10.

  • Todas las características de C++20 ahora están disponibles en /std:c++latest. Aunque la implementación de MSVC de los estándares de C++20 (tal y como publica actualmente ISO) está completa, se espera que se modifiquen algunas características clave de la biblioteca de C++20 mediante próximos informes de defectos (correcciones de errores de C++20 de ISO), que pueden cambiarlas de forma incompatible con ABI. Vea el Problema 1814 de STL de Microsoft para obtener más detalles.

    • Se ha agregado compatibilidad con funciones inmediatas y constinit de C++20 en la versión 16.10
    • Las partes finales de <chrono> : nuevos relojes, segundos intercalares, zonas horarias y análisis.
    • Implementación de <format> para el formato de texto
  • /openmp:llvm ahora está disponible en x86 y ARM64, además de x64.

  • Los directorios de inclusión ahora se pueden designar como externos con niveles de advertencia de compilación personalizados y configuración de análisis de código.

  • Se ha agregado la opción de /await:strict para habilitar las corrutinas de estilo de C++20 en los modos de lenguaje anteriores.

  • La visualización del depurador de std::coroutine_handle<T> ahora muestra el nombre y la firma de la función de corutina original y el punto de suspensión actual.

  • Se ha agregado compatibilidad para CMakePresets.

  • Ahora se le pide que acepte o rechace la huella digital de la clave de host presentada por el servidor al agregar una nueva conexión remota en Visual Studio.

  • Se ha agregado un modificador /external a MSVC para especificar los encabezados que deben tratarse como externos con fines de advertencia.

Novedades de C++ en Visual Studio, versión 16.9

Para obtener un resumen de las nuevas características y correcciones de errores en la versión 16.9 de Visual Studio, vea Novedades de la versión 16.9 de Visual Studio 2019.

  • AddressSanitizer:

    • Nuestra compatibilidad con AddressSanitizer en Windows ha dejado de estar en modo experimental y ha alcanzado la disponibilidad general.

    • Se expandió la compatibilidad con RtlAllocateHeap, se corrigió un problema de compatibilidad con los interceptores RtlCreateHeap y RtlAllocateHeap al crear bloques de memoria ejecutables.

    • Se agregó compatibilidad con la familia de funciones de memoria heredadas GlobalAlloc y LocalAlloc. Puede habilitar estos interceptores estableciendo la marca de entorno ASAN_OPTIONS=windows_hook_legacy_allocators=true.

    • Se actualizaron los mensajes de error de los errores de intercepción e intercalación de la memoria oculta para que los problemas y las resoluciones sean explícitos.

    • La integración del IDE ahora puede controlar la colección completa de excepciones que ASan puede informar.

    • El compilador y el enlazador le sugerirán emitir información de depuración si se detecta que está realizando una compilación con ASan pero no emite información de depuración.

  • Ahora puede establecer como destino la versión de LLVM del entorno de ejecución de OpenMP con el modificador de CL /openmp:llvm nuevo. Esto agrega compatibilidad con la cláusula lastprivate en las secciones #pragma omp y las variables de índice no asignadas en bucles for en paralelo. Actualmente, el modificador /openmp:llvm solo está disponible para el destino amd64 y sigue siendo experimental.

  • Los proyectos de CMake de Visual Studio ahora tienen compatibilidad de primera clase con el desarrollo remoto de Windows. Esto incluye la configuración de un proyecto de CMake con Windows ARM64 como destino, la implementación del proyecto en una máquina remota Windows y la depuración del proyecto en una máquina remota Windows desde Visual Studio.

  • La versión de Ninja que se incluye con Visual Studio en Windows se actualizó a la versión 1.10. Para obtener más información sobre lo que se incluye, consulte las notas de la versión 1.10 de Ninja.

  • La versión de CMake que se incluye con Visual Studio se actualizó a la versión 3.19. Para obtener más información sobre lo que se incluye, consulte las notas de la versión 3.19 de CMake.

  • Varios tipos de bloqueo o protección en STL se marcaron como nodiscard.

  • IntelliSense:

  • MSVC ahora determina los tiempos de ejecución correctos de AddressSanitizer que se requieren para los archivos binarios. El proyecto de Visual Studio obtendrá automáticamente los nuevos cambios. Al usar AddressSanitizer en la línea de comandos, ahora solo tiene que pasar /fsanitize=address al compilador.

  • Connection Manager de Visual Studio ahora admite claves privadas mediante el algoritmo de clave pública ECDSA.

  • Se han actualizado a v11 las versiones de LLVM y Clang incluidas en nuestro instalador. Lea las notas de la versión de LLVM y Clang para obtener más información.

  • Visual Studio ahora usará variables de CMake de archivos de cadena de herramientas para configurar IntelliSense. Esto proporcionará una mejor experiencia para el desarrollo integrado y de Android.

  • Implementación de la propuesta Más contenedores Constexpr, que permite que los destructores y las nuevas expresiones sean constexpr. Esto allana el camino para utilidades como constexprstd::vector y std::string.

  • Soporte extendido para módulos de C++20 IntelliSense, incluidos Ir a definición, Ir a módulo y finalización de miembros.

  • Ahora se admiten plantillas de función abreviadas en el compilador MSVC.

Novedades de C++ en Visual Studio, versión 16.8

Para obtener un resumen de las nuevas características y correcciones de errores en la versión 16.8 de Visual Studio, vea Novedades de la versión 16.8 de Visual Studio 2019.

  • Las corrutinas de C++20 ahora se admiten en /std:c++latest (o /std:c++20 a partir de la versión 16.11 de Visual Studio 2019) y el encabezado <coroutine>.

  • IntelliSense ahora proporciona compatibilidad con los encabezados <concepts> y <ranges> de C++20, y para cambiar el nombre y buscar definiciones de concepto.

  • Nuestro STL ahora es compatible con la mayoría de rangos de C++20.

  • Las funciones miembro especiales triviales según determinadas condiciones ahora se admiten en MSVC.

  • C11 y C17 ahora se admiten en los modificadores /std:c11 y /std:c17.

  • Entre las mejoras adicionales de STL se incluye la compatibilidad total con std::atomic_ref, std::midpoint y std::lerp y std::execution::unseq, optimizaciones para std::reverse_copy y más.

  • Versión actualizada de CMake que se incluye con Visual Studio en CMake 3.18.

  • Nuestras herramientas de análisis de código ahora admiten el estándar SARIF 2.1: el formato de registro de análisis estático estándar del sector.

  • Si faltan herramientas de compilación en los proyectos de Linux, ahora se emitirá una advertencia en la barra de herramientas y una descripción clara de las herramientas que faltan en la lista de errores.

  • Ahora puede depurar volcados de memoria principales de Linux en un sistema Linux remoto o en WSL directamente desde Visual Studio.

  • Para la generación de comentarios Doxygen de C++, hemos agregado las opciones de estilo de comentario adicionales (/*! y //!).

  • Anuncios de vcpkg adicionales.

  • Compatibilidad del compilador con lambdas en contextos no evaluados.

  • Rendimiento del vínculo /DEBUG:FULL mejorado mediante la creación de PDB de multithreading. Varias aplicaciones de gran tamaño y juegos AAA ven una vinculación entre dos y cuatro veces más rápida.

  • El depurador de Visual Studio ahora es compatible con char8_t .

  • Compatibilidad con proyectos ARM64 mediante clang-cl.

  • Compatibilidad con los intrínsecos de Intel AMX.

Novedades de C++ en Visual Studio, versión 16.7

Para obtener un resumen de las nuevas características y correcciones de errores en la versión 16.7 de Visual Studio, vea Novedades de la versión 16.7 de Visual Studio 2019.

  • Nuestra compatibilidad remota con C++ ahora admite una gama más amplia de distribuciones y shells de Linux, como sh, csh, bash, tcsh, ksh, zsh y dash. Puede invalidar el shell seleccionado para una conexión remota modificando la nueva propiedad "shell" a través de ConnectionManager.exe. Esta compatibilidad se ha probado con proyectos de Linux basados en MSBuild y proyectos de CMake orientados a un sistema Linux remoto o a WSL.

  • Ahora se puede usar Ninja (un sistema de compilación que evalúa las compilaciones incrementales con mucha rapidez) para mejorar los tiempos de compilaciones incrementales para los proyectos de Linux basados en MSBuild. Se puede optar por esta característica al establecer "Habilitar compilación incremental" en "Con Ninja" en la página de propiedades General. Ninja (ninja-build) debe estar instalado en el sistema Linux remoto o WSL.

  • Se han implementado nuevas características de la biblioteca estándar de C++20. Para obtener una lista detallada, vea el registro de cambios de Stephan T. Lavavej en GitHub.

  • Ahora, se pueden editar y establecer conexiones remotas predeterminadas en Connection Manager. Esto significa que puede editar conexiones remotas existentes (por ejemplo, en caso de que la dirección IP haya cambiado), así como establecer conexiones predeterminadas para que se usen en CMakeSettings.json y launch.vs.json. Las conexiones SSH remotas permiten compilar y depurar proyectos de C++ en un sistema Linux remoto directamente desde Visual Studio.

  • Compatibilidad mejorada con IntelliSense para Clang en Windows (clang-cl) en Visual Studio. Ahora, la ruta de acceso de inclusión de clang incluye las bibliotecas de clang. Hemos mejorado la visualización de subrayado ondulado en el editor al usar la biblioteca estándar y hemos agregado compatibilidad con C++2a en modo clang.

  • ahora puede probar errores de código subyacentes y ver más correcciones rápidas sugeridas en proyectos de C++. Habilite esta característica en Herramientas > Opciones > Editor de texto > C/C++ > Experimental. Establezca Deshabilitar linter de código experimental en false. Encontrará más información en el blog del equipo de C++.

  • Hemos agregado cuatro nuevas reglas de análisis de código para incorporar más características de seguridad a C++: C26817, C26818, C26819 y C26820.

  • Hemos agregado compatibilidad de primer nivel para depurar proyectos de CMake en sistemas remotos con gdbserver.

  • Encuentre errores de memoria dañada fácilmente con una implementación experimental de AddressSanitizer para C++ en Visual Studio, ahora disponible para proyectos nativos de x64. Ahora también se admite el uso de entornos de ejecución de depuración (/MTd, /MDd, /LDd).

  • Ahora, IntelliSense tiene compatibilidad básica con conceptos, inicializadores designados y otras características de C++20.

  • Los archivos .ixx y .cppm ahora se reconocen como C++ y se tratarán como tales mediante el resaltado de sintaxis e IntelliSense.

Novedades de C++ en Visual Studio, versión 16.6

Para obtener un resumen de las nuevas características y correcciones de errores en la versión 16.6 de Visual Studio, vea Novedades de la versión 16.6 de Visual Studio 2019.

  • Generación de comentarios Doxygen/XML mejorada: Puede generar automáticamente código auxiliar de comentario de documentación XML o Doxygen escribiendo /// o /** sobre las funciones. Ahora también se muestran en la información sobre herramientas de Información rápida.

  • Compatibilidad de Ninja con CMake para Linux/WSL: use Ninja como generador subyacente al compilar proyectos de CMake en WSL o un sistema remoto. Ninja es ahora el generador predeterminado al agregar una nueva configuración de Linux o WSL.

  • Plantillas de depuración para la depuración de CMake remota: hemos simplificado las plantillas para depurar proyectos de CMake en un sistema Linux remoto o en WSL con gdb.

  • Compatibilidad inicial con los conceptos de C++20: IntelliSense ahora reconoce los conceptos de C++20 y los sugiere en la lista de miembros.

Novedades de C++ en Visual Studio, versión 16.5

Para obtener un resumen de las nuevas características y correcciones de errores en la versión 16.5 de Visual Studio, vea Novedades de la versión 16.5 de Visual Studio 2019.

  • Compatibilidad con el modelo de finalización de equipos de IntelliCode y las variables miembro: los desarrolladores de C++ ahora pueden entrenar los modelos de IntelliCode en sus propias bases de código. Decimos que esto es un modelo de finalización de equipos porque puede aprovechar las prácticas de su equipo. Además, hemos mejorado las sugerencias de IntelliCode para las variables de miembro.

  • Mejoras de IntelliSense:

    • IntelliSense muestra ahora más nombres de tipos legibles al tratar con la Biblioteca estándar.
    • Se ha agregado la capacidad de alternar si las teclas Entrar, Espacio y Tabulador funcionan como caracteres de confirmación, y de alternar si el tabulador se usa para Insertar fragmento de código. Esta configuración se encuentra en Herramientas > Opciones > Editor de texto > C/C++ > Avanzadas > IntelliSense.
  • Administrador de conexiones en la línea de comandos: ahora puede interactuar con las conexiones remotas almacenadas desde la línea de comandos. Resulta útil para tareas como el aprovisionamiento de un nuevo equipo de desarrollo o la configuración de Visual Studio en la integración continua.

  • Depuración e implementación para WSL: use la compatibilidad nativa de Visual Studio con WSL para separar el sistema de compilación del sistema de implementación remota. Ahora puede compilar de forma nativa en WSL e implementar los artefactos de compilación en un segundo sistema remoto para la depuración. Este flujo de trabajo es compatible tanto con proyectos de CMake como con proyectos de Linux basados en MSBuild.

  • Compatibilidad con el modo de cumplimiento de FIPS 140-2: Visual Studio ahora admite el modo de cumplimiento del estándar FIPS 140-2 en el desarrollo de aplicaciones de C++ destinadas a un sistema Linux remoto.

  • Servicios de lenguaje para archivos de lenguaje de CMake y manipulación de proyectos de CMake mejorada:

    • Se ha optimizado la copia del archivo de origen para los proyectos de CMake que tienen como destino un sistema Linux remoto. Visual Studio ahora mantiene un "archivo de huella digital" del último conjunto de orígenes copiados de forma remota y optimiza el comportamiento en función del número de archivos que han cambiado.

    • Las características de navegación de código, como, por ejemplo, Ir a definición y Buscar todas las referencias son ahora compatibles con funciones, variables y destinos en archivos de script de CMake.

    • Agregue, quite o cambie el nombre de los archivos de código fuente y destinos de los proyectos de CMake desde el IDE sin modificar manualmente los scripts de CMake. Al agregar o quitar archivos con el Explorador de soluciones, Visual Studio editará automáticamente el proyecto de CMake. También puede agregar y quitar los destinos del proyecto, así como cambiarles el nombre, desde la vista Destinos del Explorador de soluciones.

  • Mejoras de proyectos de Linux: ahora, IntelliSense cuenta con una mayor precisión en proyectos de Linux de Visual Studio, lo que le permite controlar la sincronización del encabezado remota por proyecto.

Novedades de C++ en Visual Studio, versión 16.4

Para obtener un resumen de las nuevas características y correcciones de errores en la versión 16.4 de Visual Studio, vea Novedades de la versión 16.4 de Visual Studio 2019.

  • Ahora Code Analysis es compatible de forma nativa con Clang-Tidy para proyectos de MSBuild y CMake, tanto si usa un conjunto de herramientas de Clang como de MSVC. Las comprobaciones de Clang-Tidy pueden ejecutarse como parte del análisis de código en segundo plano, aparecer como advertencias en el editor (subrayado ondulado) y aparecer en la lista de errores.

  • Ahora los proyectos de CMake de Visual Studio tienen páginas de información general que le ayudarán a empezar a trabajar con el desarrollo multiplataforma. Estas páginas son dinámicas y le ayudan a conectarse a un sistema Linux y a agregar una configuración de Linux o WSL al proyecto de CMake.

  • Ahora en el menú desplegable de inicio para los proyectos de CMake se muestran los destinos usados más recientemente, y además se pueden filtrar.

  • Ahora C++/CLI admite la interoperabilidad con .NET Core 3.1 y versiones posteriores en Windows.

  • Ahora puede habilitar ASan para los proyectos compilados con MSVC en Windows para la instrumentación de código de C++ en tiempo de ejecución que ayuda a detectar errores de memoria.

  • Actualizaciones de la biblioteca C++ Standard de MSVC:

    • C++17: se ha implementado la precisión general de to_chars(), para completar las conversiones de cadenas elementales (charconv) de P0067R5. Esto completa la implementación de todas las características de la biblioteca en el estándar C++17.
    • C++20: se han implementado conceptos de cambio de nombre de P1754R1 en standard_case. Para incluir estas características, use la opción del compilador /std:c++latest (o /std:c++20 a partir de la versión 16.11 de Visual Studio 2019). La opción también se puede establecer en la página de propiedades del proyecto Propiedades de configuración > C/C++ > Lenguaje mediante la propiedad Estándar de lenguaje C++.
  • Ahora hay disponible una nueva colección de herramientas denominada C++ Build Insights. Para obtener más información sobre el anuncio, vea el blog del equipo de C++.

Novedades de C++ en Visual Studio, versión 16.3

Para obtener un resumen de las nuevas características y correcciones de errores en la versión 16.3 de Visual Studio, vea Novedades de la versión 16.3 de Visual Studio 2019.

  • Los desarrolladores de C++ ahora pueden alternar los comentarios de línea mediante el método abreviado de teclado Ctrl+K, Ctrl+/ .

  • Ahora, las listas de miembros de IntelliSense se filtran en función de calificadores de tipo; por ejemplo, const std::vector ahora filtrará métodos como push_back.

  • Hemos agregado estas características de la biblioteca estándar de C++20 (disponible en /std:c++latest o /std:c++20 a partir de la versión 16.11 de Visual Studio 2019):

    • P0487R1: corrección de operator>>(basic_istream&, CharT*)
    • P0616R0: uso de move() en <numeric>
    • P0758R1: is_nothrow_convertible
    • P0734R0: extensiones de C++ para conceptos
    • P0898R3: conceptos de biblioteca estándar
    • P0919R3: búsqueda heterogénea para contenedores sin ordenar
  • Nuevas comprobaciones de instrucciones de C++ Core, incluido el nuevo conjunto de reglas “Enum Rules”, así como reglas adicionales de tipo, const y enum.

  • Un nuevo esquema predeterminado de coloración semántica permite a los usuarios comprender mejor su código a simple vista, la ventana Pila de llamadas se puede configurar para ocultar los argumentos de la plantilla, e IntelliCode de C++ está activado de forma predeterminada.

  • Configure los destinos de depuración y las tareas personalizadas con variables de entorno mediante CMakeSettings.json o CppProperties.json, o bien con la nueva etiqueta “env” en tareas y destinos individuales en launch.vs.json y tasks.vs.json.

  • Ahora, los usuarios pueden usar una acción rápida en paquetes de vcpkg que falten para abrir automáticamente una consola y realizar una instalación en la instancia de vcpkg predeterminada.

  • La copia de encabezados remotos realizada por proyectos de Linux (CMake y MSBuild) se ha optimizado y ahora se ejecuta en paralelo.

  • La compatibilidad nativa con WSL de Visual Studio ahora admite las compilaciones en paralelo para proyectos de Linux basados en MSBuild.

  • Ahora, los usuarios pueden especificar una lista de resultados de compilación locales para implementarlos en un sistema remoto con proyectos de archivos Make de Linux.

  • Las descripciones del Editor de configuración de CMake ahora contienen más contexto y vínculos a la documentación de ayuda.

  • El modelo base de C++ para IntelliCode ahora está habilitado de forma predeterminada. Para cambiar esta configuración, vaya a Herramientas>Opciones>IntelliCode.

Novedades de C++ en Visual Studio, versión 16.2

Para obtener un resumen de las nuevas características y correcciones de errores en la versión 16.2 de Visual Studio, vea Novedades de la versión 16.2 de Visual Studio 2019.

  • En los proyectos de CMake locales configurados con Clang, el análisis de código ejecuta ahora comprobaciones de Clang-Tidy, que aparecen como parte del análisis de código en segundo plano en forma de advertencias en el editor (subrayados ondulados) y en la lista de errores.

  • Se ha actualizado el encabezado <charconv> para las conversiones de cadena elementales P0067R5 de C++17:

    • Se han agregado sobrecargas de to_chars() de punto flotante para precisión de chars_format::fixed y chars_format::scientific (chars_format::general precision es la única parte aún no implementada).
    • Se ha optimizado el elemento más corto de chars_format::fixed.
  • Se han agregado las siguientes características de la biblioteca estándar de C++20:

    • Disponible en /std:c++latest (o /std:c++20 a partir de la versión 16.11 de Visual Studio 2019):
      • P0020R6: atomic<floating-point>
      • P0463R1: enumeración endian
      • P0482R6: tipochar8_t para cadenas y caracteres UTF-8
      • P0653R2: to_address() para convertir un puntero en un puntero básico
    • Disponible en /std:c++17 y /std:c++latest (o /std:c++20 a partir de la versión 16.11 de Visual Studio 2019):
      • P0600R1: [[nodiscard]] en la biblioteca
    • Disponible sin condiciones:
      • P0754R2: encabezado <version>
      • P0771R1: el constructor de movimiento std::function debe ser noexcept
  • Windows SDK ya no es una dependencia de los componentes CMake para Windows y CMake para Linux.

  • Se han hecho ajustes en el enlazador de C++ para mejorar significativamente los tiempos de compilación de la iteración para la entrada más grande. Los tiempos de /DEBUG:FAST y /INCREMENTAL son de media el doble de rápidos, y /DEBUG:FULL es ahora de tres a seis veces más rápido.

Novedades de C++ en Visual Studio, versión 16.1

Para obtener un resumen de las nuevas características y correcciones de errores en la versión 16.1 de Visual Studio, vea Novedades de la versión 16.1 de Visual Studio 2019.

compilador C++

  • Estas características de C++20 se han implementado en el compilador de C++, disponible en /std:c++latest (o /std:c++20 a partir de la versión 16.11 de Visual Studio 2019):

    • Se ha aumentado la capacidad de encontrar las plantillas de función a través de la búsqueda dependiente de argumentos para las expresiones de llamada de función con argumentos de plantilla explícitos (P0846R0).
    • Se ha agregado la inicialización designada (P0329R4), que permite seleccionar miembros específicos en inicialización agregada, por ejemplo, con la sintaxis Type t { .member = expr }.
  • Se ha revisado la compatibilidad con expresiones lambda para corregir un gran número de errores pendientes de corregir. Este cambio está habilitado de forma predeterminada al usar /std:c++20 o /std:c++latest . En el modo de lenguaje /std:c++17 y en el modo predeterminado /std:c++14 ), el nuevo analizador se puede habilitar mediante el uso de /Zc:lambda en Visual Studio 2019, versión 16.9 o posterior (disponible previamente como /experimental:newLambdaProcessor a partir de la versión 16.3 de Visual Studio 2019); por ejemplo, /std:c++17 /Zc:lambda.

Mejoras de la biblioteca estándar de C++

  • Estas características de C++20 se han agregado a la implementación de la biblioteca estándar de C++, disponible en /std:c++latest:
    • starts_with y ends_with para basic_string y basic_string_view.
    • contains para contenedores asociativos.
    • remove, remove_if y unique para list y forward_list ahora devuelven size_type.
    • Se han agregado shift_left y shift_right a <algorithm>.

C++ IDE

IntelliCode para C++

IntelliCode ahora se distribuye como un componente opcional en la carga de trabajo Desarrollo para el escritorio con C++ . Para más información, vea Improved C++ IntelliCode now Ships with Visual Studio 2019 (IntelliCode mejorado para C++ ahora se distribuye con Visual Studio 2019).

IntelliCode usa un amplio aprendizaje y su contexto de código para colocar lo que es más probable que use en la parte superior de la lista de finalización. A menudo puede eliminar la necesidad de desplazarse hacia abajo por la lista. Para C++, IntelliCode ofrece más ayuda al usar bibliotecas conocidas, como la biblioteca estándar.

Las nuevas características de IntelliCode (modelos personalizados, compatibilidad con C++ e inferencia de EditorConfig) están deshabilitadas de forma predeterminada. Para habilitarlas, vaya a Herramientas > Opciones > IntelliCode > General. Esta versión de IntelliCode ha mejorado en precisión e incluye compatibilidad con funciones libres. Para obtener más información, vea AI-Assisted Code Completion Suggestions Come to C++ via IntelliCode (Las sugerencias de finalización de código asistidas por inteligencia artificial se hacen realidad en C++ a través de IntelliCode).

Mejoras en la información rápida

  • La Información rápida ahora respeta los colores semánticos del editor. También tiene un nuevo vínculo Buscar en línea que buscará documentación en línea para obtener información sobre la construcción de código activado. Si se trata de código subrayado en rojo, el vínculo proporcionado por Información rápida buscará el error en línea. De esta forma, no es necesario que vuelva a escribir el mensaje en el explorador. Para más información, vea Quick Info Improvements in Visual Studio 2019: Colorization and Search Online (Mejoras de Información rápida en Visual Studio 2019: colores y búsqueda en línea).

Mejoras generales

  • La Barra de plantillas puede rellenar el menú desplegable en función de las instancias que haya de esa plantilla en el código base.

  • Se han agregado bombillas para cuando faltan directivas #include que pueden instalarse mediante vcpkg, y la finalización automática de paquetes disponibles para la directiva find_package de CMake.

  • Se ha revisado la página de propiedades General de los proyectos de C++. Algunas opciones aparecen ahora en una nueva página Opciones avanzadas. La página Opciones avanzadas también incluye propiedades nuevas para la arquitectura preferida del conjunto de herramientas, las bibliotecas de depuración, la versión secundaria del conjunto de herramientas MSVC y las compilaciones de Unity (jumbo).

Compatibilidad con CMake

  • Hemos actualizado la versión de CMake que se incluye con Visual Studio a la versión 3.14. Esta versión agrega compatibilidad integrada con generadores de MSBuild destinados a proyectos de Visual Studio 2019, así como API para la integración de IDE basada en archivos.

  • Hemos agregado mejoras en el Editor de configuraciones de CMake (por ejemplo, compatibilidad con el Subsistema de Windows para Linux [WSL] y las configuraciones de las cachés existentes), cambios en las raíces predeterminadas de compilación e instalación, y compatibilidad con variables de entorno en las configuraciones de CMake de Linux.

  • Las finalizaciones y la información rápida de los comandos integrados de CMake, las variables y las propiedades facilitan la edición de los archivos CMakeLists.txt .

  • Hemos integrado compatibilidad para editar, compilar y depurar proyectos de CMake con Clang/LLVM. Para más información, vea Clang/LLVM Support in Visual Studio (Compatibilidad con Clang/LLVM en Visual Studio).

Linux y el subsistema de Windows para Linux

Análisis de código

Compilaciones remotas

  • Los usuarios pueden ahora separar las máquinas de compilación remota de las máquinas de depuración remota cuando el destino es Linux, tanto para proyectos MSBuild como CMake.

  • El mejor registro para las conexiones remotas facilita el diagnóstico de problemas con desarrollo multiplataforma.

Novedades de C++ en Visual Studio, versión 16.0

Para obtener un resumen de las nuevas características y correcciones de errores en la versión 16.0 de Visual Studio, vea Novedades de la versión 16.0 de Visual Studio 2019.

compilador C++

  • Se proporciona compatibilidad mejorada con las características y las correcciones de exactitud de C++17, además de compatibilidad experimental con características de C++20, como módulos y corrutinas. Para obtener información detallada, vea C++ Conformance Improvements in Visual Studio 2019 (Mejoras de conformidad de C++ en Visual Studio 2019).

  • La opción /std:c++latest ahora incluye características de C++20 que no están necesariamente completas, como la compatibilidad inicial con el operador <=> de C++20 ("nave espacial") para la comparación de tres vías.

  • El modificador del compilador /Gm de C++ ahora está en desuso. Considere la posibilidad de deshabilitar el modificador /Gm en los scripts de compilación si se define explícitamente, aunque también puede ignorar de manera segura la advertencia de desuso de /Gm, ya que no se tratará como un error cuando use "Tratar advertencias como errores" (/WX).

  • Cuando MSVC empiece a implementar las características del proyecto estándar de C++20 con la marca /std:c++latest, /std:c++latest ahora será incompatible con /clr (todas las versiones), /ZW y /Gm. En Visual Studio 2019, use los modos /std:c++17 o /std:c++14 al compilar con /clr, /ZW o /Gm (pero vea la viñeta anterior).

  • Los encabezados precompilados ya no se generan de forma predeterminada para la consola de C++ y las aplicaciones de escritorio.

Codegen, seguridad, diagnóstico y control de versiones

Análisis mejorado con /Qspectre para proporcionar asistencia de mitigación en Spectre Variant 1 (CVE-2017-5753). Para obtener más información, vea Spectre Mitigations in MSVC (Mitigaciones de Spectre en MSVC).

Mejoras de la biblioteca estándar de C++

  • Implementación de características y correcciones de exactitud de la biblioteca de C++17 y C++20 adicionales. Para obtener información detallada, vea C++ Conformance Improvements in Visual Studio 2019 (Mejoras de conformidad de C++ en Visual Studio 2019).

  • Se ha aplicado el formato clang a los encabezados de la biblioteca estándar de C++ para mejorar la legibilidad.

  • Dado que Visual Studio ahora admite Solo mi código de C++, la biblioteca estándar ya no necesita proporcionar maquinaria personalizada para que std::function y std::visit consigan el mismo efecto. Quitar esa maquinaria no tiene en gran medida ningún efecto visible para el usuario. Una excepción es que el compilador ya no producirá diagnósticos que indiquen problemas en la línea 15732480 o 16707566 de <type_traits> o <variant>.

Mejoras de rendimiento en el compilador y la biblioteca estándar

  • Mejoras en el rendimiento de la compilación, incluida la manera en que el enlazador trata la E/S de archivos y el tiempo de vínculo en la creación y la combinación de tipos de PDB.

  • Se ha agregado compatibilidad básica para la vectorización de OpenMP SIMD. Puede habilitarla con el nuevo modificador del compilador /openmp:experimental. Esta opción permite vectorizar potencialmente los bucles anotados con #pragma omp simd. No se garantiza la vectorización y se genera una advertencia para los bucles anotados sin vectorizar. No se admiten cláusulas SIMD; se omiten, y se notifica una advertencia.

  • Se ha agregado un nuevo modificador de línea de comandos de inserción, /Ob3, que es una versión más agresiva de /Ob2. /O2 (optimizar el binario para acelerar el proceso) todavía implica /Ob2 de manera predeterminada. Si considera que el compilador no realiza las inserciones con la suficiente agresividad, considere la posibilidad de pasar /O2 -Ob3.

  • Hemos agregado compatibilidad con las funciones intrínsecas de la biblioteca matemática de vectores cortos (SVML). Estas funciones calculan los equivalentes de vectores de 128 bits, 256 bits o 512 bits. Se han agregado para admitir la vectorización manual de bucles con llamadas a funciones de la biblioteca matemática y otras operaciones como la división de enteros. Vea la Guía de funciones intrínsecas de Intel para las definiciones de las funciones admitidas.

  • Optimizaciones nuevas y mejoradas:

    • Simplificaciones aritméticas y plegado constante para las expresiones que usan intrínsecos de vector SIMD, para formatos de entero y float.

    • Un análisis más eficaz para extraer información de flujo de control (instrucciones if/else/switch) para quitar ramas que siempre se han demostrado true o false.

    • Despliegue mejorado de memset para usar instrucciones de vectores de SSE2.

    • Eliminación mejorada de copias de estructuras/clases inútiles, especialmente para los programas de C++ que pasan por valor.

    • Optimización mejorada del código que usa memmove, como la construcción std::copy, std::vector y std::string.

  • Se ha optimizado el diseño físico de la biblioteca estándar para evitar compilar partes de la biblioteca estándar no incluidas directamente. Este cambio reduce el tiempo de compilación de un archivo vacío que incluya solo <vector> de forma parcial. Como consecuencia, es posible que deba agregar directivas #include para los encabezados que se incluyeron indirectamente. Por ejemplo, el código que usa std::out_of_range puede que ahora deba agregar #include <stdexcept>. El código que usa un operador de inserción de flujos puede que ahora necesite agregar #include <ostream>. La ventaja es que solo las unidades de traducción que realmente usan los componentes <stdexcept> o <ostream> pagan el costo de rendimiento por compilarlos.

  • if constexpr se aplicó en más lugares de la biblioteca estándar para mejorar el rendimiento y el tamaño del código reducido en las operaciones de copia, en permutaciones como invertir y girar y en la biblioteca de algoritmos paralelos.

  • La biblioteca estándar ahora usa if constexpr internamente para reducir los tiempos de compilación, incluso en el modo C++14.

  • La detección de vínculos dinámicos en tiempo de ejecución para la biblioteca de algoritmos paralelos ya no usa una página completa para almacenar la matriz de puntero de función. Marcar esta memoria como de solo lectura ya no se consideraba pertinente por motivos de seguridad.

  • El constructor de std::thread ya no espera a que el subproceso se inicie y ya no inserta tantas capas de llamadas a función entre la biblioteca de C subyacente _beginthreadex y el objeto invocable proporcionado. Anteriormente std::thread coloca seis funciones entre _beginthreadex y el objeto al que se puede llamar. Esta cantidad se ha reducido a solo tres, dos de los cuales son simplemente std::invoke. Este cambio también resuelve un error de tiempo desconocido donde un constructor std::thread dejaría de responder si el reloj del sistema cambiara en el momento exacto de creación del elemento std::thread.

  • Se ha corregido una regresión del rendimiento en std::hash que hemos introducido al implementar std::hash<std::filesystem::path>.

  • En varios lugares, la biblioteca estándar ahora usa destructores en lugar de bloques catch para conseguir exactitud. Este cambio produce una mejor interacción del depurador: Las excepciones lanzadas mediante la biblioteca estándar en las ubicaciones afectadas ahora se muestran como procedentes del sitio de lanzamiento original, en lugar del sitio de reinicio. No se eliminaron todos los bloques catch de la biblioteca estándar. Esperamos que se reduzca el número de bloques catch en versiones posteriores de MSVC.

  • La generación de código subóptima de std::bitset producida por un lanzamiento condicional dentro de una función noexcept se ha corregido mediante la deducción de la ruta de acceso de lanzamiento.

  • La familia std::list y std::unordered_* usan iteradores no depuradores internamente en más lugares.

  • Se han modificado varios miembros de std::list para reutilizar los nodos de lista cuando sea posible, en lugar de desasignarlos y reasignarlos. Por ejemplo, dado list<int> que ya tiene un tamaño de 3, una llamada a assign(4, 1729) ahora sobrescribe los valores de tipo int en los 3 primeros nodos de la lista y asigna un nuevo nodo de lista con el valor 1729.

  • Todas las llamadas de la biblioteca estándar a erase(begin(), end()) se cambiaron a clear().

  • std::vector ahora inicializa y borra los elementos con mayor eficacia en determinados casos.

  • Mejoras en std::variant para que sea más adecuado para optimizadores, lo que conlleva un código mejor generado. La inserción de código ha mejorado mucho con std::visit.

C++ IDE

Compatibilidad de Live Share con C++

Live Share ahora es compatible con C++, lo que permite a los desarrolladores que usan Visual Studio o Visual Studio Code colaborar en tiempo real. Para obtener más información, vea Announcing Live Share for C++: Real-Time Sharing and Collaboration (Presentación de Live Share para C++: colaboración y uso compartido en tiempo real).

IntelliSense para plantilla

Ahora, la barra de plantillas usa la interfaz de usuario de ventana de inspección en lugar de una ventana modal, admite plantillas anidadas y rellena previamente los argumentos predeterminados en la ventana de inspección. Para obtener más información, vea Template IntelliSense Improvements for Visual Studio 2019 Preview 2 (Mejoras de IntelliSense para plantilla para Visual Studio 2019, versión preliminar 2). La lista desplegable Usados más recientemente de la barra de plantillas permite cambiar rápidamente entre conjuntos anteriores de argumentos de ejemplo.

Nueva experiencia de la ventana de inicio

Al iniciar el IDE, aparece una nueva ventana de inicio con opciones para abrir proyectos recientes, clonar código del control de código fuente, abrir código local como una solución o carpeta, o crear un proyecto. También se ha mejorado el cuadro de diálogo Nuevo proyecto con una experiencia inicial para búsqueda filtrable.

Nuevos nombres para algunas plantillas de proyecto

Hemos modificado varios nombres y descripciones de plantilla de proyecto para que quepan en el cuadro de diálogo actualizado Nuevo proyecto.

Diversas mejoras de productividad

Visual Studio 2019 incluye las siguientes características que ayudarán a que el proceso de codificar sea más sencillo e intuitivo:

  • Revisiones rápidas para:
    • Agregar #include que falta
    • NULL a nullptr
    • Agregar punto y coma faltante
    • Resolver los espacios de nombres o ámbitos que faltan
    • Reemplazar los operandos de direccionamiento indirecto incorrectos (* a & y & a *)
  • Información rápida para un bloque al mover el puntero sobre la llave de cierre
  • Inspección del archivo de encabezado o código
  • Ir a definición en #include abre el archivo

Para obtener más información, vea C++ Productivity Improvements in Visual Studio 2019 Preview 2 (Mejoras de productividad en Visual Studio 2019, versión preliminar 2).

Compatibilidad con CMake

  • Compatibilidad con CMake 3.14

  • Visual Studio ahora puede abrir las memorias caché de CMake existentes generadas por herramientas externas, como CMakeGUI, por sistemas de compilación de metadatos personalizados o por scripts de compilación que invocan cmake.exe.

  • Rendimiento de IntelliSense mejorado.

  • Se ha introducido un nuevo editor de configuración que supone una alternativa a la edición manual del archivo CMakeSettings.json y comparte ciertas similitudes con CMakeGUI.

  • Visual Studio impulsa el desarrollo en C++ mediante CMake en Linux, ya que detecta si tiene una versión compatible de CMake en su equipo Linux. Si no la tiene, ofrece la posibilidad de instalarla automáticamente.

  • Las opciones de configuración que son incompatibles en CMakeSettings, como las arquitecturas no coincidentes o la configuración incompatible del generador de CMake, aparecen con subrayado ondulado en el editor de JSON y con errores en la lista de errores.

  • La cadena de herramientas de vcpkg se detecta automáticamente y se habilita para los proyectos de CMake que se abren en el IDE una vez que vcpkg integrate install se ha ejecutado. Se puede desactivar este comportamiento si se especifica un archivo de cadena de herramientas vacío en CMakeSettings.

  • Los proyectos de CMake ahora habilitan la depuración de Solo mi código de forma predeterminada.

  • Las advertencias de análisis estático ahora se pueden procesar en segundo plano y mostrarse en el editor de proyectos de CMake.

  • Mensajes más claros de inicio y final de la compilación y la configuración para los proyectos de CMake y compatibilidad con la interfaz de usuario de progreso de compilación de Visual Studio. Además, ahora hay una opción de configuración del nivel de detalle de CMake en Herramientas > Opciones para personalizar el nivel de detalle de los mensajes de compilación y configuración de CMake en la ventana de salida.

  • Ahora se admite la opción cmakeToolchain en CMakeSettings.json para especificar cadenas de herramientas sin tener que modificar manualmente la línea de comandos de CMake.

  • Nuevo acceso directo del menú para Compilar todo: CTRL+Mayús+B.

Integración de IncrediBuild

IncrediBuild se incluye como un componente opcional en la carga de trabajo Desarrollo para el escritorio con C++ . El monitor de compilaciones de IncrediBuild está totalmente integrado en el IDE de Visual Studio. Para obtener más información, consulte Visualización de la compilación con el monitor de compilaciones de IncrediBuild y Visual Studio 2019.

Depuración

  • Para aplicaciones de C++ que se ejecutan en Windows, los archivos PDB ahora se cargan en un proceso independiente de 64 bits. Este cambio soluciona una variedad de bloqueos provocados por memoria insuficiente del depurador. Por ejemplo, al depurar aplicaciones que contienen un gran número de módulos y archivos PDB.

  • La búsqueda está habilitada en las ventanas Watch, Autos y Locals.

Desarrollo del escritorio de Windows con C++

  • Los siguientes asistentes de ATL/MFC de C++ ya no están disponibles:

    • Asistente para componentes ATL COM+ 1.0
    • Asistente para componentes de páginas Active Server ATL
    • Asistente para proveedores OLE DB ATL
    • Asistente para páginas de propiedades ATL
    • Asistente para consumidores OLE DB ATL
    • Consumidor ODBC MFC
    • Clase MFC de un control ActiveX
    • Clase MFC de TypeLib

    El código de ejemplo para estas tecnologías se archiva en Microsoft Learn y en el repositorio VCSamples de GitHub.

  • El kit de desarrollo de software (SDK) de Windows 8.1 ya no está disponible en el instalador de Visual Studio. Recomendamos que actualice los proyectos de C++ al Windows SDK más reciente. Si tiene una dependencia fuerte de 8.1, puede descargarlo desde el archivo de Windows SDK.

  • Ya no estará disponible Windows XP como opción de destino para el conjunto de herramientas de C++ más actualizado. Se sigue admitiendo XP como destino con bibliotecas y el compilador de MSVC de nivel de VS 2017, y se puede instalar a través de "Componentes individuales".

  • En nuestra documentación se desaconseja encarecidamente el uso de módulos de combinación para la implementación en tiempo de ejecución de Visual C++. En esta versión hemos dado un paso extra para marcar nuestros MSM como en desuso. Considere la posibilidad de migrar la implementación central VCRuntime de MSM al paquete redistribuible.

Desarrollo móvil con C++ (Android y iOS)

La experiencia Android de C++ ahora toma como valor predeterminado el Android SDK 25 y el Android NDK 16b.

Conjunto de herramientas de la plataforma Clang/C2

Se ha eliminado el componente experimental Clang/C2. Use el conjunto de herramientas MSVC para un cumplimiento total de los estándares de C++ con /permissive- y /std:c++17, o bien la cadena de herramientas Clang/LLVM para Windows.

Análisis de código

Pruebas unitarias

La plantilla de proyecto de prueba de C++ administrado ya no está disponible. Puede seguir usando el marco de pruebas de C++ administrado en los proyectos existentes. Para las pruebas unitarias nuevas, considere la opción de usar uno de los marcos de prueba nativos para los que Visual Studio proporciona plantillas (MSTest, Google Test) o la plantilla de proyecto de prueba de C# administrado.