Преобразование из binaryOperators::i
(типа int
) в binaryOperators
неявно (то есть не объявлено explicit
).
return binaryOperators (*this + right.i); // (1)
binaryOperators binaryOperators :: operator+ (const binaryOperators &right); // (2)
binaryOperators operator+ (const binaryOperators &left, const binaryOperators &right); // (3)
В строке (1) можно рассмотреть две функции operator+
: версия участника (2) и бесплатная версия (3). Поскольку LHS относится к типу binaryOperators&
, версия участника применима и предпочтительна. Его аргумент имеет тип const binaryOperators &
, а аргумент, указанный в строке (1), имеет тип int
, поэтому компилятор пытается преобразовать int
в const binaryOperators &
.
Поскольку существует не-explicit
конструктор с одним аргументом, он используется как неявное преобразование из int
в const binaryOperators &
. Теперь у нас есть два операнда типов binaryOperators&
и const binaryOperators &
, можно вызвать operator+
в (2), и мы находимся именно там, где начали.
Урок: не переусердствуйте в неявных преобразованиях.