3

我试图为这个问题写一个简单的解决方案:数组衰减到指针和重载解析

很明显,在原文中,两个重载都具有相同的转换强度(精确匹配),因此首选非模板。事实上,如果我将另一个更改为模板,调用就会变得模棱两可:

struct stg
{
    template<typename T = void>
    stg(const char* const& c_str, T* = 0);

    template<int N>
    stg(const char (&str) [N]);
};

所以我想引入一个用户定义的转换,这将比第二个重载的精确匹配更差。

struct stg
{
    template<typename> struct cvt { operator int() { return 0;} };

    template<typename T = void>
    stg(const char* const& c_str, int = cvt<T>());

    template<int N>
    stg(const char (&str) [N]);
};

但是g++ 说这仍然是模棱两可的。为什么默认参数中的自定义转换不影响重载排名?

4

1 回答 1

4

[over.match.viable]/2(来自 >n3797,github 5f7cb4)

首先,要成为一个可行的函数,候选函数应该有足够的参数以在数量上与列表中的参数一致。

  • 如果列表中有m个参数,则所有具有恰好m个参数的候选函数都是可行的。

  • 具有少于m个参数的候选函数只有在其参数列表中有省略号时才可行(8.3.5)。出于重载决议的目的,任何没有相应参数的参数都被认为是“匹配省略号”(13.3.3.1.3)。

  • 仅当(m+1) -st 参数具有默认参数 (8.3.6)时,具有多于m个参数的候选函数才是可行的。出于重载决议的目的,参数列表在右侧被截断,因此正好有m个参数。

[强调我的]

于 2014-02-23T21:27:06.230 回答