C++重载分辨率模糊不清 - GCC

Shi*_*vam 2 c++ standards gcc overload-resolution c++11

我试图理解,为什么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);
}
Run Code Online (Sandbox Code Playgroud)

有两种可用的重载:

template <class C> void f(double, A<C,8> &var);
Run Code Online (Sandbox Code Playgroud)

4.完全匹配double(不需要隐式转换),但第二个参数需要用户定义的转换.所以这个过载:exact match&user-define conversion

下一个重载,由GCC匹配:

template <class C> void f(char, A<C,5> &var);
Run Code Online (Sandbox Code Playgroud)

4.要求隐式转换为char完全匹配A<C,5>.是否有任何理由为什么海湾合作委员会选择这个超载前一个?

有人可以从标准的第13节中找到有关此特定案例的证据吗?任何帮助或评论表示赞赏.谢谢!

dyp*_*dyp 5

扣除不能成功

template <class C> void f(double, A<C,8> &var);
Run Code Online (Sandbox Code Playgroud)

和类型的参数A<int, 5>.也就是说,没有可能的类型C可以A<C,8>匹配参数类型A<int,5>.转换是可能的并不关心扣除.

见[temp.deduct.call]/4.由于转换构造函数和转换函数可以允许转换,因此无法考虑(所有)转换类型推导.它也可能导致含糊不清.