C++部分模板专业化混淆

C++ Partial template specialization confusion

本文关键字:专业化 C++      更新时间:2023-10-16

考虑以下代码片段:

template <typename A, typename B=bool>
struct pair {
    pair() {std::cout<<"This";}
    A first;
    B second;
};
template <typename T>
struct pair<T, bool> {
    pair() {std::cout<<"That";}
    T first;
    bool second;
};

为了学习的目的,我想看看上面的结构中的哪一个将被实例化(泛型声明或部分专门化),给定以下代码:

int main() {
    pair<int,int> pairB; // prints 'This'
    pair<double,bool> pairC; // prints 'That'
    pair<float> pairD; // prints 'That'
}

虽然前两个对我来说有意义,但第三个。。。没有那么多
第三个不是也应该是"这个"吗
第二个声明不是第二个类型为bool的部分专用化吗
好第二种类型不是bool,为什么不实例化第一种呢?

当编译器看到pair<float>时,它首先查找主模板的定义,即:

template <typename A, typename B=bool>
struct pair

这将给出以下参数列表(由于第二个默认值为bool):<float, bool>

编译器然后寻找任何可能匹配的专业化,并找到一个:

template <typename T>
struct pair<T, bool>  // Match <float, bool>

所以选择了这个专业。