以下のコードを VS2017 から 2019 に移植すると、新しい警告が表示されました (これは元の単純化されたバージョンです)。
main.cpp(18,90): 警告 C4834: 'nodiscard' 属性を持つ関数の戻り値を破棄しています
#include <map>
#include <vector>
using namespace std;
typedef map<int, vector<vector<void*> > > MyMap;
const int N = 16;
int main()
{
MyMap myMap;
for (auto mapIt = myMap.begin(), mapEnd = myMap.end(); mapIt != mapEnd; mapIt++)
{
int j = 0;
for (auto keyIt = (*mapIt).second.begin(), keyEnd = (*mapIt).second.end(); keyIt != keyEnd, j < N; keyIt++, j++)
{
for (auto vecIt = (*keyIt).begin(), vecEnd = (*keyIt).end(); vecIt != vecEnd; vecIt++)
{
if (*vecIt)
{
}
}
}
}
return 0;
}
for ループには、コンマで区切られた 2 つの初期化子、コンマで区切られた 2 つの条件などがあることに注意してください。forj < N
ループから条件を削除すると、警告が消えます。2 つの条件を入れ替えても、警告はありません。
演算!=
子には破棄される戻り値があり、それが唯一の条件である場合、または最後の条件である場合は破棄されないと思いますか? これはコンパイラの予想される動作ですか??