コンパイラの警告 (レベル 1) C5056

演算子 'operator-name': 配列型では非推奨

解説

C++20 では、配列型の 2 つのオペランド間の等価比較とリレーショナル比較は非推奨となっています。 詳細については、「C++ 標準提案 のP1120R0」を参照してください。

Visual Studio 2019 バージョン 16.2 以降では、(ランクとエクステントの類似性に関係なく) 2 つの配列間の比較操作で、コンパイラ オプションが有効になっていると /std:c++latest 、レベル 1 の C5056 警告が生成されるようになりました。 Visual Studio 2019 バージョン 16.11 以降では、/std:c++20

Visual Studio 2019 バージョン 16.2 以降では、コンパイラ オプションが有効になっていると /std:c++latest 、次のコードによって警告 C5056 が生成されます。 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; }
}

2 つの配列の内容が等しいかどうかを判断するには、std::equal 関数を使用します。

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