Я выполнил код пару раз, и кажется, что оператор участника выиграл.
Да, участник выигрывает в вашем примере. Но не по той причине, вы думаете.
Функции-члены имеют неявный параметр объекта (на что указывает this
), а тип параметра объекта определяется cv-квалификаторами в конце функции-члена. В этом случае у вашего оператора-члена нет cv-квалификаторов, поэтому тип неявного объекта просто A
.
По сути, у нас есть два кандидата:
bool operator==(A const&, B const&); // your non-member operator
bool operator==(A&, B const&); // your member operator
Членоператор является лучшим соответствием, потому что первый параметр является лучшим соответствием - нам не нужно брать более константную ссылку на a
.
Если вы сделали свой оператор const
(как выв общем случае), тогда у нас были бы два кандидата:
bool operator==(A const&, B const&); // your non-member operator
bool operator==(A const&, B const&); // better member operator
, которые идентичны, нет причин отдавать предпочтение одному другому, и мы получили бы двусмысленность. Не существует правила предпочитать члена функции, не являющейся членом (или наоборот).