Поведение, которое вы видите, обусловлено правильной константой. Оператор <<, определенный в классе, является неконстантным, поэтому он может работать только с неконстантным объектом или ссылкой, такой как obj. Версия, не являющаяся членом вне класса, имеет два постоянных операнда. </p>
Если бы вы написали версию участника как не-члена, это выглядело бы так:
binaryOperators operator<< (binaryOperators &left, const binaryOperators &right)
{
cout << "\nTwo";
return left;
}
При сопоставлении перегрузки компилятор выбирает наилучшее соответствие. В первом случае левый операнд не является константным, поэтому он выбирает оператор-член. Во втором случае левый операнд - это rvalue (временные двоичные операторы), на который ссылается как const, поэтому выбирается не являющийся членом оператор.