まず、演算子をメンバー関数として実装することには利点がなく、フリー関数として実装することには利点があります。特に、メンバー関数は2つのオペランドの型に関して対称ではありません。左側(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
}
ここでの主な違いは暗黙的な変換であり、それはあなたのタイプが他のタイプから暗黙的に変換できる場合にのみ違いを生むことに注意してください。タイプへの暗黙の変換がない場合、この点は重要ではありませんが、free関数を使用することに不利な点はなく、場合によっては利点があることを考慮して、可能な限りfree関数を使用します。
ここで演算子のオーバーロードについて少し前に書きましたが、そこにいくつかの提案があるかもしれません。