Mejoras en la conformidad de C++, cambios de comportamiento y correcciones de errores en Visual Studio 2022
Microsoft C/C++ en Visual Studio (MSVC) hace mejoras de conformidad y corrige errores en cada versión. En este artículo se enumeran las mejoras por versión principal y luego por versión. Para saltar directamente a los cambios para una versión específica, use la lista a continuación de En este artículo.
En este documento se enumeran los cambios en Visual Studio 2022. Para acceder a una guía de los cambios en Visual Studio 2019, consulte Mejoras de conformidad de C++ en Visual Studio 2019. Para conocer los cambios en Visual Studio 2017, consulte Mejoras de conformidad de C++ en Visual Studio 2017. Para obtener una lista completa de las mejoras de conformidad anteriores, vea Novedades de Visual C++ de 2003 a 2015.
Mejoras de conformidad en Visual Studio 2022, versión 17.0
Visual Studio 2022, versión 17.0 contiene las siguientes mejoras de conformidad, correcciones de errores y cambios de comportamiento del compilador de Microsoft C++.
Advertencia sobre el ancho del campo de bits para el tipo de enumeración
Al declarar una instancia de un tipo de enumeración como un campo de bits, el ancho del campo de bits tiene que alojar todos los valores posibles de la enumeración. De lo contrario, el compilador emite un mensaje de diagnóstico. Considere este ejemplo:
enum class E : unsigned { Zero, One, Two };
struct S {
E e : 1;
};
Un programador podría esperar que el miembro de la clase S::e pueda contener cualquiera de los valores proporcionados explícitamente con nombre enum. Dado el número de elementos de enumeración, esto no es posible. El campo de bits no puede cubrir el intervalo de valores proporcionados de forma explícita de E (conceptualmente, el E de E). Para solucionar el problema de que el ancho del campo de bits no es lo suficientemente grande para el dominio de la enumeración, se agrega una nueva advertencia (desactivada de manera predeterminada) a MSVC:
t.cpp(4,5): warning C5249: 'S::e' of type 'E' has named enumerators with values that cannot be represented in the given bit field width of '1'.
E e : 1;
^
t.cpp(1,38): note: see enumerator 'E::Two' with value '2'
enum class E : unsigned { Zero, One, Two };
^
Este comportamiento del compilador es un cambio importante de origen y binario que afecta a todos los modos /std y /permissive .
Error en la comparación de punteros ordenados con nullptr o 0
El estándar de C++ permitía accidentalmente una comparación de puntero ordenada con nullptr o 0. Por ejemplo:
bool f(int *p)
{
return p >= 0;
}
El documento WG21 N3478 ha quitado esta supervisión. MSVC ahora ha implementado este cambio. Cuando el ejemplo se compila mediante /permissive- (y /diagnostics:caret ), emite el error siguiente:
t.cpp(3,14): error C7664: '>=': ordered comparison of pointer and integer zero ('int *' and 'int')
return p >= 0;
^
Este comportamiento del compilador es un cambio importante de origen y binario que afecta al código compilado mediante los modos /permissive- y /std .