给出以下类模板+专业化:
template<class T = int>
struct S { static constexpr int value = 1; };
template<>
struct S<> { static constexpr int value = 2; };
实例化时:
S<int>::value
编译器使用value = 2实例化专门化。我的问题是,为什么编译器会那样做?我不提供任何类型的情况不是专业化吗?我认为我在理解默认模板参数时遇到问题。
答案 0 :(得分:6)
之所以选择专业化,是因为它满足实例化(使用T = int
),并且比模板更专业。
在声明特殊化template<> struct S<>
时,T
被隐式设置为int
,因为它是默认值(或者在这种情况下是默认类型)。
请考虑以下内容:
template<class U, class T = int>
struct S {
static constexpr int value = 1;
};
template<>
struct S<double> {
static constexpr int value = 2;
};
此处,出于相同的原因,S<double, int>::value
也将是2
。在专业化声明中,U
显式地指定为double
,由于默认值,T
隐式设置为int
。并且S<double, float>::value
将是1
。