C 超负荷分辨率模棱两可-GCC

C++ Overload resolution ambiguous - GCC

本文关键字:-GCC 模棱两可 分辨率 超负荷      更新时间:2023-10-16

我正在尝试理解,为什么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&amp;user-define conversion

下一个超载,与GCC相匹配:

template <class C> void f(char, A<C,5> &var);

4.需要隐式转换为char,但与A<C,5>完全匹配。GCC选择此重载以上是有什么原因?

有人可以从有关此特定情况的标准第13条中找到证据吗?任何帮助或评论将不胜感激。谢谢!

推论无法成功

template <class C> void f(double, A<C,8> &var);

和类型A<int, 5>的参数。IE。没有可能使A<C,8>匹配参数类型A<int,5>的类型C。转换是可能的不在乎扣除的。

参见[temp.deduct.call]/4。由于可以通过转换构造函数和转换功能允许转换,因此不可能考虑(所有)转换以进行类型扣除。这也可能导致歧义。