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节中找到有关此特定案例的证据吗?任何帮助或评论表示赞赏.谢谢!
扣除不能成功
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.由于转换构造函数和转换函数可以允许转换,因此无法考虑(所有)转换类型推导.它也可能导致含糊不清.
| 归档时间: |
|
| 查看次数: |
292 次 |
| 最近记录: |