Я пытаюсь понять, почему GCC выбирает f(char, A<C, 5> &var)
для разрешения перегрузки в коде ниже:
template <class C, int N> struct A { };
template <class C> struct A<C, 8> { static_assert(sizeof(C) > 8, "Assertion in A<C,8>"); };
template <class C> struct A<C, 5> { static_assert(sizeof(C) < 8, "Assertion in A<C,5>"); operator A<C,8>&(); };
template <class C> void f(double, A<C,8> &var);
template <class C> void f(char, A<C,5> &var);
int main(void)
{
A<int, 5> a;
f(4., a);
}
Доступны две перегрузки:
template <class C> void f(double, A<C,8> &var);
4.
точно соответствует double
(неявное преобразование не требуется), но для второго параметра требуется пользовательское преобразование. Итак, эта перегрузка: exact match
и user-define conversion
Следующая перегрузка, которая соответствует GCC:
template <class C> void f(char, A<C,5> &var);
4.
требует неявного преобразования в char
, но точного соответствия для A<C,5>
. Есть ли причина, по которой GCC выбирает эту перегрузку по сравнению с предыдущей?
Может ли кто-нибудь найти доказательства из раздела 13 стандарта по этому конкретному делу? Любая помощь или комментарий приветствуются. Спасибо!