Avviso del compilatore (livello 4) C5054

operatore 'operator-name': deprecato tra enumerazioni di tipi diversi

Osservazioni:

C++20 ha deprecato le normali conversioni aritmetiche sugli operandi, dove un operando è di tipo enumerazione e l'altro è di un tipo di enumerazione diverso. Per altre informazioni, vedere P1120R0 proposta standard C++.

In Visual Studio 2019 versione 16.2 e successive, una conversione implicita tra tipi di enumerazione genera un avviso di livello 4 quando l'opzione del /std:c++latest compilatore è abilitata. In Visual Studio 2019 versione 16.11 e successive genera anche un avviso in /std:c++20.

Esempio

In Visual Studio 2019 versione 16.2 e successive, il codice seguente genera un avviso di livello 4 quando l'opzione del /std:c++latest compilatore è abilitata. In Visual Studio 2019 versione 16.11 e successive genera anche un avviso in /std:c++20:

// C5054.cpp
// Compile using: cl /EHsc /W4 /std:c++latest C5054.cpp
enum E1 { a };
enum E2 { b };
int main() {
    int i = a | b; // warning C5054: operator '|': deprecated between enumerations of different types
}

Per evitare l'avviso, usare static_cast per convertire il secondo operando:

// C5054_fixed.cpp
// Compile using: cl /EHsc /W4 /std:c++latest C5054_fixed.cpp
enum E1 { a };
enum E2 { b };
int main() {
  int i = a | static_cast<int>(b);
}