C++部分模板专业化混淆
C++ Partial template specialization confusion
考虑以下代码片段:
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>
所以选择了这个专业。
相关文章:
- 如何使用默认参数等选择模板专业化
- 模板化建造师专业化
- 类模板的成员功能的定义在单独的TU中完全专业化
- 部分专业化和嵌套模板
- 模板专业化可以进入我的.cpp吗?
- 别名模板的专业化 C++11 中没有开销的最佳替代方案
- 部分专业化和对标准::void_t<>的需求
- "专业化不参与超载"
- 特定好友功能专业化
- 是否可以混合使用SFINAE和模板专业化?
- 为什么在班级专业化上会出现错误?
- enable_if如何帮助选择类模板的专业化?
- std::initializer_list可以专业化吗?
- 派生类中纯虚拟基方法的专业化
- "expected a '>'"类模板专业化?
- Clang不会编译GCC会编译的模板专业化
- 我可以用clang AST从模板专业化中获得默认的模板参数吗
- 函数模板部分专业化-有什么解决方法吗
- 类模板的编译错误,但其专业化除外
- 我应该声明我的函数模板专业化还是定义它们就足够了