【发布时间】:2014-01-21 19:13:20
【问题描述】:
我试图理解,为什么 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 节中找到有关此特定案例的证据吗?任何帮助或评论表示赞赏。谢谢!
【问题讨论】:
标签: c++ gcc c++11 standards overload-resolution