vylepšení shody C++, změny chování a opravy chyb v Visual Studio 2022
Microsoft C/C++ v Visual Studio (MSVC) provádí vylepšení shody a opravy chyb v každé verzi. V tomto článku jsou uvedená vylepšení podle hlavní verze a pak podle verze. Chcete-li přejít přímo na změny konkrétní verze, použijte následující seznam v tomto článku.
tento dokument obsahuje seznam změn v Visual Studio 2022. průvodce změnami v Visual Studio 2019 naleznete v tématu vylepšení shody C++ v Visual Studio 2019. změny v Visual Studio 2017 naleznete v tématu vylepšení shody C++ v Visual Studio 2017. Úplný seznam předchozích vylepšení dodržování shody najdete v tématu Visual C++ novinky 2003 až 2015.
vylepšení shody v Visual Studio 2022 verze 17,0
Visual Studio 2022 verze 17,0 obsahuje následující vylepšení shody, opravy chyb a změny chování v kompilátoru Microsoft C++.
Upozornění na bitového pole šířce pro typ výčtu
Pokud deklarujete instanci typu výčtu jako bitového pole, Šířka bitového pole musí vyhovovat všem možným hodnotám výčtu. V opačném případě kompilátor vydá diagnostickou zprávu. Vezměte v úvahu tento příklad: Zvažte následující:
enum class E : unsigned { Zero, One, Two };
struct S {
E e : 1;
};
Programátor může očekávat, že člen třídy S::e může obsahovat libovolnou z explicitně pojmenovaných enum hodnot. Vzhledem k počtu elementů výčtu není možné. Bitového pole nemůže pokrývat rozsah explicitně poskytovaných hodnot E (koncepční, EE ). Chcete-li vyřešit obavy, že šířka bitového pole není dostatečně velká pro doménu výčtu, je do MSVC přidáno nové (ve výchozím nastavení vypnuté) upozornění:
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 };
^
Toto chování kompilátoru je zdrojovou a binární zálomená změna, která má vliv na všechny /std/permissive režimy a.
Chyba při porovnání seřazeného ukazatele proti nullptr nebo 0
Standard jazyka C++ neúmyslně povolil objednané porovnání ukazatele proti nullptr nebo 0. Například:
bool f(int *p)
{
return p >= 0;
}
WG21 papír N3478 odstranil tento dohled. MSVC nyní implementovala tuto změnu. Když je příklad kompilován pomocí /permissive- (a /diagnostics:caret ), vygeneruje následující chybu:
t.cpp(3,14): error C7664: '>=': ordered comparison of pointer and integer zero ('int *' and 'int')
return p >= 0;
^
Toto chování kompilátoru je zdrojovou a binární změnou, která má vliv na kód zkompilovaný pomocí /permissive- ve všech /std režimech.