コンパイラの警告 (レベル 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));