Я пытался поэкспериментировать с некоторыми базовыми концепциями разрешения перегрузок, используя следующий тестовый код:
void foo()
{
void F(int x, int y); // F1
void F(char x, double y); // F2
F('A', 5);
}
Я «пытался» понять применимые части стандарта С++ 17, а также просмотрел сайт cppreference.com. Насколько я понимаю, последовательность преобразования для F1 состоит из повышения и точного совпадения, тогда как последовательность преобразования для F2 состоит из точного совпадения и преобразования. cppreference.com частично заявляет, что
...
F1 is determined to be a better function than F2 if implicit conversions for all
arguments of F1 are not worse than the implicit conversions for all arguments of
F2, and
1) there is at least one argument of F1 whose implicit conversion is better than
the corresponding implicit conversion for that argument of F2
...
Основываясь на всем вышесказанном, я подумал, что F1 должен быть принят как лучший кандидат, потому что худшая конверсия для F1 лучше, чем худшая конверсия для F2. Однако компиляторы Microsoft и minGW генерируют «неоднозначную» ошибку совпадения. Так что, очевидно, я что-то упускаю. Я был бы признателен за объяснение того, что мне не хватает, и ссылку на эту информацию в С++ 17. Спасибо!