Ответ 1
Только операторы, которые компилируются в вызов подпрограммы, могут быть перегружены. Поскольку вызовы подпрограмм оценивают свои аргументы перед выполнением вызова, те операторы, которые требуют отложенной оценки одного из своих операндов, обрабатываются как специальные формы в компиляторе.
Логические операторы, как and
, or
, &&
, и ||
, определены как оценивающие только их второй операнд в зависимости от истинности их первого операнда, и поэтому не могут быть скомпилированы в вызовы подпрограмм.
Даже если бы они были скомпилированы в вызов подпрограммы, который отбросил второй операнд, многократная диспетчеризация, как написано в вопросе, все равно была бы невозможна для типа второго аргумента, так как семантика этих операторов означает, что мы не можем оценить это сразу, но это, в свою очередь, означает, что мы не можем найти его тип для отправки.