有时我有这样的结构——
struct aggregate1 {
std::string name;
std::vector<ValueT> options;
size_t foobar;
// ...
};
-- 其中(不)平等被简单地定义为所有成员的(不)平等: lhs_name == rhs_name && lhs_options == rhs_options && lhs_foobar == rhs_foobar
。
实现这一点的“最佳”方式是什么? (最佳:(运行时-)效率、可维护性、可读性)
operator==
就operator!=
operator!=
就operator==
==
和!=
的单独实现- 作为会员还是免费功能?
请注意,此问题仅与(不)平等操作有关,因为比较( <
, <=
,…)对于此类聚合没有太大意义。
原文由 Martin Ba 发布,翻译遵循 CC BY-SA 4.0 许可协议
在 C++20 中,实现相等和不等运算符可以很简单,只需将
operator==
声明为default
:If only
operator==
is provided,a!=b
is interpreted as!(a==b)
according to overload resolution, so there is no need for providing an explicit overload foroperator!=
.我认为默认
operator==
作为隐藏的朋友更可取,因为它适用于引用包装的对象:在此示例中,没有为
operator==
定义std::reference_wrapper<S>
,但参数相关查找 (ADL) 可以选择隐藏的朋友,其操作数隐式转换为S const &
。但是请注意,::operator==(rs,rs)
仅在operator==
被定义为自由函数时才有效,因为不会为限定名称触发 ADL。