【问题标题】:Conversion of default arguments not considered during overload selection?重载选择期间不考虑默认参数的转换?
【发布时间】:2014-03-25 08:14:26
【问题描述】:

我试图为这个问题写一个简单的解决方案:array decay to pointer and overload resolution

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

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++ says this is still ambiguous。为什么默认参数中的自定义转换不影响重载排名?

【问题讨论】:

  • 我认为默认参数被忽略以进行重载解析?
  • @dyp:看来你的想法是对的。你能举出使它如此的规则吗?这将是一个答案。

标签: c++ type-conversion language-lawyer overload-resolution default-arguments


【解决方案1】:

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

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

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

  • 具有更少的候选函数 比 m 参数只有在它有一个省略号时才是可行的 参数列表(8.3.5)。出于重载决议的目的,任何 考虑没有对应参数的参数 “匹配省略号” (13.3.3.1.3)。

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

[强调我的]

【讨论】:

  • 我喜欢你的重点和我的一模一样:)
  • @jrok:不再是了,他现在有斜体了 :-)
猜你喜欢
  • 2019-09-11
  • 2021-07-20
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-03-18
相关资源
最近更新 更多