【发布时间】: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<X>解析为FirstWins<X, int>。FirstWins<X, int>定义的实际选择发生在B对int的“替换”之后。 -
@Holt:当然,但我的问题确实与
SecondWins<X, int>相关。在这种情况下,SecondWins<X, int>优先于SecondWins<X, =int>。 -
@L.Bruce 因为
SecondWins<A, B=int>与SecondWins<A, B>在模板选择方面没有什么不同,所以专业化SecondsWins<A, int>比非专业化更受欢迎。默认模板参数在这里对解析没有影响。 -
@Holt:嗯,在某种程度上它确实有影响,我相信。看看
FirstWins。默认参数B=int和显式参数float之间的不匹配导致选择第一个。B默认为不是float的任何东西都会产生影响。
标签: c++ templates overloading partial-specialization default-arguments