传递默认模板类型参数时,编译器选择模板专业化

时间:2018-12-06 13:08:42

标签: c++

给出以下类模板+专业化:

template<class T = int>
struct S { static constexpr int value = 1; };

template<>
struct S<> { static constexpr int value = 2; };

实例化时:

S<int>::value

编译器使用value = 2实例化专门化。我的问题是,为什么编译器会那样做?我不提供任何类型的情况不是专业化吗?我认为我在理解默认模板参数时遇到问题。

1 个答案:

答案 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