运算符通常被首选为自由函数的原因是它们在类型上是对称的。当类型具有隐式转换时,这一点更重要,或者实际上根本不重要。
例如,考虑一个optional
类似于std::optional
即将到来的 C++14 标准的类型,它可以从模板参数类型隐式转换,并考虑将可选对象与嵌套类型进行比较(并假设您不想实现所有operator<
变体,标准实际上是这样做的):
// optional is like std::optional, implements operator<(optional<T>,optional<T>)
// but we did not care to provide operator<(T,optional<T>) and operator<(optional<T>,T)
optional<int> oi = 1; // good, we can implicitly convert
if (oi < 10) { // and we can compare
...
} else if (0 < oi) { // we also want to compare this way!
...
}
现在如果operator<
被实现为一个自由函数,那么上面的代码就可以工作了。如果它被实现为成员函数,则第二个if
将失败,因为在调用成员函数之前不能将转换应用于左侧。
将 operator< 之类的东西实现为成员函数是否合适?或者这样做没有优势?
在某些情况下它并不重要,但它也不会提供优势。虽然这个陈述并不完全正确......对于以一种或另一种方式实现的运算符来说,查找是不同的,但在一般情况下它并不重要。如果您处于重要的情况,那么还有更深层次的问题需要关心。