首先,将操作符实现为成员函数没有任何优势,而将其作为自由函数实现可能会有优势。特别是,成员函数关于两个操作数的类型是不对称的,左侧(lhs)必须是调用它的类的确切类型,而右侧side (rhs) 可以使用隐式转换。在自由函数运算符的情况下,可以将相同的转换应用于 lhs 和 rhs。
struct SomeClass {
SomeClass( int value );
bool operator<( SomeClass const & ) const;
};
bool operator>( SomeClass const &, SomeClass const & );
int main() {
SomeClass x( 10 );
x < 100; // Fine, lhs is SomeClass
// 100 < x; // Error, no operator< can take int as lhs and SomeClass
x > 100; // Fine
100 > x; // Also fine, lhs can take the same implicit conversions
}
请注意,这里的主要区别是隐式转换,只有当您的类型可以从其他类型隐式转换时才会有所不同。如果没有隐式转换到您的类型,那么这一点将没有实际意义,但考虑到使用自由函数没有缺点并且在某些情况下有优势,我会尽可能使用自由函数。
我前段时间在这里写过关于运算符重载的文章,你可能会在那里找到一些建议。