C++ 为什么是接线员!=在C+中删除+;20对于许多标准库类型?
根据,C++ 为什么是接线员!=在C+中删除+;20对于许多标准库类型?,c++,c++-standard-library,comparison-operators,c++20,equality-operator,C++,C++ Standard Library,Comparison Operators,C++20,Equality Operator,根据,std::type_info::operator=被C++20删除,但是,std::type_info::operator==显然仍然存在 背后的原因是什么?我可能同意比较不平等是没有意义的,但是比较平等也是没有意义的,不是吗 类似地,操作符=,包括容器,如和,将根据CPPFREFERENCE在C++20中删除 必须编写if(!(id1==id2))与if(id1!=id2)相比,没有任何代码更清晰,相反,恰恰相反……我们不需要提供操作符的库=不再。提供operator==允许编译器执行一
std::type_info::operator=代码>被C++20删除,但是,std::type_info::operator==
显然仍然存在
背后的原因是什么?我可能同意比较不平等是没有意义的,但是比较平等也是没有意义的,不是吗
类似地,操作符=许多其他标准库类型的代码>,包括容器,如和,将根据CPPFREFERENCE在C++20中删除
必须编写if(!(id1==id2))
与if(id1!=id2)
相比,没有任何代码更清晰,相反,恰恰相反……我们不需要提供操作符的库=代码>不再。提供operator==
允许编译器执行一些杂耍和计算a!=b
就a==b而言,都是独立的
[over.match.oper]
对于一元运算符@,其操作数类型为
cv非限定版本为T1,对于带左
cv非限定版本为T1且为右的类型的操作数
cv非限定版本为T2的类型的操作数,四组
候选人职能、指定成员候选人、非成员候选人
候选对象、内置候选对象和重写的候选对象是
结构如下:
为了这个!=运算符([expr.eq]),重写的候选者
包括表达式x==y的所有未重写候选项
std::type_info
和更多的库类型都有其操作符=在C++20中,关系操作符的工作方式发生了变化,特别是随着spaceship
操作符的引入。特别是,如果只提供运算符==
,则a!=b
被重写为!(a==b)
发件人:
重写的候选集确定如下:
- 对于关系([expr.rel])运算符,重写的候选者包括表达式xy的所有未重写候选者
- 对于关系([expr.rel])和三向比较([expr.spaceship])运算符,对于表达式yx的每个未重写候选,重写候选还包括一个合成候选,两个参数的顺序颠倒
- 对于运算符([expr.eq]),重写的候选者包括表达式x==y的所有未重写候选者。
- 对于等式运算符,对于表达式y==x的每个未重写候选,重写候选还包括合成候选,两个参数的顺序颠倒
- 对于所有其他运算符,重写的候选集为空
以及:
如果通过运算符@的重载解析选择了重写运算符==候选运算符,则其返回类型应为cv bool,且x@y解释为:
- 如果@is!=所选候选是一个参数顺序相反的合成候选!(y==x)
- 否则,如果@is!=!(x==y)
- 否则(当@is==),y==x
在每种情况下,使用选定的重写运算符==候选运算符
因此,运算符的显式重载=代码>不再是必需的。移除运算符并没有改变比较语义
所有集装箱都有操作员=代码>已删除,据我所知(例如检查)。唯一的例外是容器适配器std::queue
和std::stack
:我的猜测是,当与第三方容器一起使用时,它是为了保持向后兼容性,以防相等运算符不对称。可能也很有趣,因为我相信这是消除重载的建议。