C++ 默认模板参数在(部分专用)类模板重载解析中的作用
解释以下程序的行为:C++ 默认模板参数在(部分专用)类模板重载解析中的作用,c++,templates,overloading,partial-specialization,default-arguments,C++,Templates,Overloading,Partial Specialization,Default Arguments,解释以下程序的行为: 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; }; templat
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;
}
模板
结构第一胜{
静态constexpr int i=1;
};
模板
struct FirstWins以某种方式解释了此规则,但同样没有明确解释)。模板
结构{
//...
};
可视为
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>
{
//...
};
模板
结构;
//所以S就是S
//主模板
模板
结构
{
//...
};
//可能的专业化
模板
结构
{
//...
};
然后,可以更清楚地使用哪个实例化。当代码不提供类型时,默认参数只提供一个类型。它对选择专门化没有影响。我认为您对默认模板参数的用途感到困惑。在您的示例中,它只是表示FirstWins
解析为FirstWins
。FirstWins
定义的实际选择发生在B
对int
的“替换”之后@Holt:当然,但我的问题确实与SecondWins
有关。在这种情况下,SecondWins
优先于SecondWins
@L.Bruce,因为SecondWins
与SecondWins
在模板选择方面没有什么不同,因此专门化SecondsWins
优先于非专门化。默认模板参数在这里对解析没有影响。@霍尔特:我相信,在某种程度上它确实有影响。查看FirstWins
。默认参数B=int
与显式参数float
之间存在不匹配,导致选择第一个参数<代码>B
默认为任何非浮动的值都会产生不同。
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>
{
//...
};