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