Компілятор працює правильно, відповідно до [over.match] та [conv] , точніше [conv.fpint] та [conv.ptr].
Стандартною послідовністю перетворення є [бла-бла] нуль або одна [...] плаваючо-інтегральна конверсія, перетворення вказівника, [...].
і
Первісне значення цілочисельного типу або незапечатаного типу перерахування може бути перетворене в перше значення типу з плаваючою комою. Результат є точним, якщо можливо [бла-бла]
і
Константа нульового покажчика - це ціле число, що знаходиться в прямому значенні, зі значенням нуль або [...]. Нульова константа вказівника може бути перетворена в тип вказівника; результат - нульове значення вказівника цього типу [бла-бла]
Тепер роздільна здатність перевантаження - це вибір найкращої відповідності між усіма функціями-кандидатами (які, як забавна функція, навіть не повинні бути доступними у місці виклику!). Найкраще співпадає з точними параметрами або, як альтернатива, найменшими перетвореннями. Нульова або одна стандартна конверсія може статися (... для кожного параметра), а нуль "кращий", ніж один.
(1-1)
- ціле число, яке має значення 0
.
Ви можете перетворити нульове ціле буквальне значення в кожне з double
або double*
(або nullptr_t
) з точно одним перетворенням. Отже, якщо припустити, що більш ніж одна з цих функцій оголошена (як це в прикладі), існує більше одного кандидата, і всі кандидати однаково хороші, немає кращої відповідності. Це неоднозначно, і укладач має рацію щодо скарги.
1-1
1
-