Компилятор работает правильно, в соответствии с [over.match] и [conv] , более конкретно [conv.fpint] и [conv.ptr].
Стандартной последовательностью преобразования является [бла-бла] Ноль или одно [...] преобразование с плавающей запятой, преобразования указателя, [...].
а также
Значение типа integer или перечисления с незаданной областью может быть преобразовано в значение типа с плавающей точкой. Результат точен, если возможно [бла-бла]
а также
Константа нулевого указателя - это целочисленный литерал со значением ноль или [...]. Константа нулевого указателя может быть преобразована в тип указателя; результатом является значение нулевого указателя этого типа [бла-бла]
Теперь разрешение перегрузки заключается в выборе наилучшего соответствия среди всех функций-кандидатов (которые, в качестве забавной функции, даже не должны быть доступны в месте вызова!). Лучшее совпадение - это то, которое имеет точные параметры или, с другой стороны, наименьшее количество возможных преобразований. Может произойти ноль или одно стандартное преобразование (... для каждого параметра), и ноль "лучше", чем один.
(1-1)
представляет собой целое число со значением буквальным 0
.
Вы можете преобразовать нулевой целочисленный литерал в каждый из любых double
или double*
(или nullptr_t
), с ровно одним преобразованием. Таким образом, предполагая, что объявлено более одной из этих функций (как в случае с примером), существует более одного кандидата, и все кандидаты одинаково хороши, лучшего совпадения не существует. Это неоднозначно, и компилятор прав насчет жалоб.
1-1
1
-