Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/152.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 为什么是接线员!=在C+中删除+;20对于许多标准库类型?_C++_C++ Standard Library_Comparison Operators_C++20_Equality Operator - Fatal编程技术网

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
和更多的库类型都有其
操作符=
操作符的引入。特别是,如果只提供
运算符==
,则
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
:我的猜测是,当与第三方容器一起使用时,它是为了保持向后兼容性,以防相等运算符不对称。

可能也很有趣,因为我相信这是消除重载的建议。