【问题标题】:Role of default template parameters in overload resolution of (partially specialized) class templates默认模板参数在(部分特化)类模板的重载解析中的作用
【发布时间】:2018-11-17 09:54:30
【问题描述】:

This answer 解释了以下程序的行为:

template<typename A, typename B = int >
struct FirstWins {
    static constexpr int i = 1;
};
template<typename A>
struct FirstWins<A, float/* anything different from int */ > {
    static constexpr int i = 2;
};

template<typename A, typename B = int >
struct SecondWins {
    static constexpr int i = 1;
};
template<typename A>
struct SecondWins<A, int > {
    static constexpr int i = 2;
};

int main()
{
    typedef void Whatever_t;
    cout << FirstWins < Whatever_t >::i << endl;  // prints 1
    cout << SecondWins< Whatever_t >::i << endl;  // prints 2
    return 0;
}

但是,我找不到明确描述此行为并因此确认答案的实际参考。

我在 cppreference.com 上找不到确认显式模板参数优于默认参数的句子。

我怀疑这不是真正的规则。规则是,只要有与模板参数匹配的部分模板特化,总是选择该特化而不是主模板的实例化。它是否正确? (在这种情况下,the docs 以某种方式解释了这条规则,但同样没有明确地解释)。

【问题讨论】:

  • 默认参数只提供类型,而代码不提供。它对选择专业没有影响。
  • 我认为您对默认模板参数的用途感到困惑。在您的示例中,这仅意味着 FirstWins&lt;X&gt; 解析为 FirstWins&lt;X, int&gt;。 FirstWins&lt;X, int&gt; 定义的实际选择发生在B 对int 的“替换”之后。
  • @Holt:当然,但我的问题确实与SecondWins&lt;X, int&gt; 相关。在这种情况下,SecondWins&lt;X, int&gt; 优先于 SecondWins&lt;X, =int&gt;。
  • @L.Bruce 因为SecondWins&lt;A, B=int&gt; 与SecondWins&lt;A, B&gt; 在模板选择方面没有什么不同,所以专业化SecondsWins&lt;A, int&gt; 比非专业化更受欢迎。默认模板参数在这里对解析没有影响。
  • @Holt:嗯,在某种程度上它确实有影响,我相信。看看FirstWins。默认参数B=int 和显式参数float 之间的不匹配导致选择第一个。 B 默认为不是 float 的任何东西都会产生影响。

标签: c++ templates overloading partial-specialization default-arguments


【解决方案1】:
template<typename A, typename B = int >
struct S {
//...
};

可以看作

template<typename A, typename B = int >
struct S;
// So S<A> is S<A, int>

// Primary template
template<typename A, typename B>
struct S
{
   //...
};

// Possible specialization as
template<typename A>
struct S<A, int>
{
   //...
};

那么,使用哪个实例化就更清楚了。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-12-31
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-11-09
    相关资源
    最近更新 更多