Поделиться через


Предупреждение компилятора (уровень 1) C5056

оператор "operator-name": не рекомендуется использовать для типов массивов

Замечания

Равенство и реляционные сравнения между двумя операндами типа массива устарели в C++20. Дополнительные сведения см. в P1120R0 предложения C++Standard.

В Visual Studio 2019 версии 16.2 и более поздних версиях операция сравнения между двумя массивами (несмотря на сходство ранга и экстентов) теперь выдает предупреждение уровня 1 C5056 при включении параметра компилятора /std:c++latest . В Visual Studio 2019 версии 16.11 и более поздних версиях он также создает предупреждение в /std:c++20разделе .

Пример

В Visual Studio 2019 версии 16.2 и более поздних версиях следующий код выдает предупреждение C5056 при /std:c++latest включении параметра компилятора. В Visual Studio 2019 версии 16.11 и более поздних версиях также создается предупреждение в /std:c++20разделе :

// C5056.cpp
// Compile using: cl /EHsc /W4 /std:c++latest C5056.cpp
int main() {
    int a[] = { 1, 2, 3 };
    int b[] = { 1, 2, 3 };
    if (a == b) { return 1; } // warning C5056: operator '==': deprecated for array types
}

Чтобы избежать этого предупреждения, можно сравнить адреса первых элементов:

// C5056_fixed.cpp
// Compile using: cl /EHsc /W4 /std:c++latest C5056_fixed.cpp
int main() {
    int a[] = { 1, 2, 3 };
    int b[] = { 1, 2, 3 };
    if (&a[0] == &b[0]) { return 1; }
}

Чтобы определить, равно ли содержимое двух массивов, используйте функцию std::equal:

std::equal(std::begin(a), std::end(a), std::begin(b), std::end(b));