Ну, как вы знаете, разрешение перегрузки происходит в три этапа: (1) перечисление функций-кандидатов;(2) определить, какие функции-кандидаты являются жизнеспособными;(3) выберите наилучшую жизнеспособную функцию.
Согласно [over.match.best] / 1:
... жизнеспособная функция F1
определена каклучшая функция, чем у другой жизнеспособной функции F2
, если для всех аргументов i , ICS i (F1
) не хуже последовательности преобразования, чем ICS i (F1
), а затем
- для некоторого аргумента j , ICS j (
F1
) - лучшая последовательность преобразования, чем ICS j (F2
) или, если не так, - , контекст является инициализацией с помощью пользовательского преобразования (см. 11.6, 16.3.1.5 и 16.3.1.6) и стандартной последовательности преобразованияпереход от типа возврата
F1
к типу назначения (т. е. к типу инициализируемой сущности) является лучшей последовательностью преобразования, чем стандартная последовательность преобразования из типа возврата F2
к типу назначения [пример ...] или, если не так, - [... дальнейшие правила тай-брейка ...]
Неявное преобразование rот s
до неявного параметра объекта, равного # 1 или # 2, является преобразование идентификатора, поэтому ICS1 (# 1) и ICS2 (# 1) неразличимы, и здесь важен второй пункт маркированного списка.В случае # 1 требуется преобразование из производного в базовое значение для преобразования из возвращаемого типа функции преобразования, а именно D&
, в требуемый тип, а именно B&
.В случае № 2 стандартной последовательностью преобразования является преобразование идентификаторов (B&
в B&
), что лучше.Поэтому в этом контексте функция # 2 выбрана лучше, чем # 1.