MSVC 2019:C ++ for循环更改警告中逗号分隔条件的顺序

问题描述

将以下代码从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循环具有两个逗号分隔的初始化器,两个逗号分隔的条件等。如果我从for循环中删除j < N条件,该警告将消失。如果我同时交换两个条件,也不会发出警告。

我假设!=运算符有一些返回值被丢弃,并且如果它是唯一条件,或者如果它是最后一个条件,则不将其丢弃?这是编译器的预期行为吗?

解决方法

谢谢大家! 看来,此遗留代码的意图确实是为了 svg.append("g") .attr("fill","steelblue") .attr("fill-opacity",0.8) .selectAll("rect") .data(data) .join("rect") .attr("d",d => valuebox) 这两个条件。逗号运算符是一个错误。