我最近查看了我的旧代码,但我无法弄清楚这是做什么的,或者它是否有效。代码类似于:
map<string, string> map;
map[string1] = ("s", string2);
答案 0 :(得分:14)
这是一种混淆。逗号运算符从左到右计算所有参数,但丢弃除最后一个参数之外的所有参数。整个表达式的形式类型是最终参数的类型。
(另请注意,逗号本身就是一个排序点。)
string2成为地图中的值,位于键string1下。
答案 1 :(得分:6)
表达式"s", string2
使用内置的 1 comma operator。它具有以下语义:
在逗号表达式
E1, E2
中,表达式E1被评估,其结果被丢弃,并且在表达式E2的评估开始之前完成其副作用(注意用户定义的运算符,不能保证排序) (直到C ++ 17 )。逗号表达式结果的类型,值和值类别正是第二个操作数E2的类型,值和值类别。
如果是您的代码段,它根本不是很有用,它的唯一目的是让读者感到困惑。由于评估"s"
没有副作用,因此代码与此相同:
map<string, string> map;
map[string1] = string2;
<小时/> 1 这假设没有定义与参数匹配的用户定义的
operator,
。如果有,它可以做任何事情,这个答案的其余部分不适用。您必须查看源代码以找出表达式的评估结果。
答案 2 :(得分:4)
这可能是逗号运算符,它会评估所有内容,然后丢弃除右侧值之外的所有内容。
但是,如果operator,( char const*, string2 )
超载,则可以执行任何操作(string2
类型为string2
)。
寻找这样的重载。
请注意,如果string2
为std::string
,此类重载可能会导致您的程序生成错误,则无需进行诊断。不会阻止人们这样做。并且它可以&#34;工作&#34;并且仍允许,
(例如)导致字符串连接。
答案 3 :(得分:1)
逗号是运算符,它从左到右计算参数,并且具有最右边元素的值。
例如:
int a=2, b=3, c;
c = (a+=b, a*b);
因此,从左侧开始,a+=b
首先进行评估,将a
设置为2+3
,然后a*b
进行评估,并且表达式的值为5*3
,使用哪个值。因此c
是15