自定义FrameStyle结构体重载==后无法使用!=运算符的问题
C++自定义结构体运算符重载问题解答
问题背景
使用clang version 12.0.0(Target: x86_64-pc-windows-msvc)编译器,自定义gns::FrameStyle结构体,其成员QColor、Qt::PenStyle、Distance均支持==比较,已手动重载operator==,但直接使用operator!=比较该结构体对象时出现编译错误:invalid operands to binary expression ('gns::FrameStyle' and 'gns::FrameStyle'),而通过!(style == m_prevStyle)的方式可正常运行。
为何需要重载operator==?
- C++编译器自动生成默认
operator==的条件非常严格:只有当类/结构体没有用户声明的构造函数、析构函数、赋值运算符,且所有非静态成员都支持相等比较时,才会生成逐成员比较的默认operator==。如果你的FrameStyle结构体存在自定义的构造逻辑、或者你需要自定义相等判断规则(比如忽略某些成员的比较),就必须手动重载operator==来实现符合需求的比较逻辑。 - 即便所有成员都支持
==,只要结构体存在用户定义的其他成员函数(比如自定义构造函数),编译器就不会生成默认的operator==,此时必须手动重载才能使用==进行对象比较,否则会触发编译错误。
为何编译器不会自动生成operator!=?
- 在C11到C17标准中,编译器不会为类/结构体自动生成
operator!=,哪怕你已经重载了operator==。只有在C++20及之后的标准中,编译器才会自动基于operator==生成对应的operator!=(逻辑等价于!(a == b))。 - 你使用的clang 12.0.0默认遵循C17标准(除非手动指定更高版本编译选项),而C17不支持自动生成
operator!=,因此直接使用!=时,编译器找不到对应的运算符重载,从而报错;而!(style == m_prevStyle)是调用你已重载的operator==后取反,属于合法的表达式,因此可以正常运行。
内容的提问来源于stack exchange,提问作者Vladimir Bershov
相关产品推荐
相关产品推荐

