(expr1,expr2)在作业的右侧做了什么?

thr*_*wer 8 c++ dictionary

我最近查看了我的旧代码,我无法弄清楚这是做什么的,或者它是否有效.代码类似于:

map<string, string> map;
map[string1] = ("s", string2);
Run Code Online (Sandbox Code Playgroud)

Bat*_*eba 14

这是一种混淆.逗号运算符从左到右计算所有参数,但丢弃除最后一个参数之外的所有参数.整个表达式的形式类型是最终参数的类型.

(另请注意,逗号本身就是一个排序点.)

string2在键string1下成为地图中的值.

  • 在假设这个之前,我至少会检查`,`是不是超载了. (2认同)
  • 可以丢弃逗号运算符之前的表达式的值,但其副作用不是.在这种情况下,没有效果,因为逗号运算符之前的表达式没有副作用. (2认同)

IIn*_*ble 6

该表达式"s", string2使用内置的1个 逗号运算符.它具有以下语义:

在逗号表达式中E1, E2,表达式E1被评估,其结果被丢弃,并且在评估表达式E2开始之前完成其副作用(注意用户定义的运算符,不能保证排序)(直到C++ 17).

逗号表达式结果的类型,值和值类别正是第二个操作数E2的类型,值和值类别.

如果是您的代码段,它根本没用,它的唯一目的是让读者感到困惑.由于评估"s"没有副作用,因此代码与此相同:

map<string, string> map;
map[string1] = string2;
Run Code Online (Sandbox Code Playgroud)


1 这假设没有定义用户定义的operator,匹配参数.如果有,它可以做任何事情,这个答案的其余部分不适用.您必须查看源代码以找出表达式求值的内容.