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.

Viz také

Shoda v jazyce Microsoft C/C++