类模板专用化中模板参数的默认值
Default values of template parameters in the class template specializations
请考虑以下代码:
template <class x1, class x2 = int*>
struct CoreTemplate { };
template <class x1, class x2>
struct CoreTemplate<x1*, x2*> { int spec; CoreTemplate() { spec = 1; } };
template <class x>
struct CoreTemplate<x*> { int spec; CoreTemplate() { spec = 3; } };
int main(int argc, char* argv[])
{
CoreTemplate<int*, int*> qq1;
printf("var=%d.rn", qq1.spec);
CoreTemplate<int*> qq2;
printf("var=%d.rn", qq2.spec);
}
MSVC 可以精细地编译此代码,并在这两种情况下选择第二个专用化。对我来说,这些专业是相同的。第一手的第二专业化有多合法?
只是好奇,对此有什么想法吗?
第二个部分专业化是合法的,与第一个不同。
第二个部分专用化不会在其模板参数列表中列出第二个模板参数的参数,因此使用默认参数 int*
,因此它等效于:
template <class x>
struct CoreTemplate<x*, int*> { ... };
对于第一个模板参数为指针类型且第二个模板参数为 int*
的任何实例化,将选择该实例。
并且第二个模板参数是除 int*
之外的任何指针类型时,将使用第一个部分专用化。
在程序中,qq1
和qq2
都使用 int*
作为第二个模板参数(显式或使用默认参数),因此都选择第二个实例化。
相关文章:
- 当给定默认值时,为什么此模板参数推导失败
- 如何在C++中提供模板化函数作为另一个函数的参数,默认值?
- 在 c++ 中,如果我创建一个接受一个具有默认值的参数的构造函数 - 它会用作默认(空)构造函数吗?
- 为什么无法在可变参数模板中将尾随模板参数指定为默认值?
- 可变参数模板和具有继承的默认值
- 具有默认值的单个参数构造函数是否与默认构造函数相同?
- 在子类函数覆盖中省略具有默认值的参数
- 函数作为具有默认值的参数
- 具有另一个具有默认值的模板参数的模板推导
- const变量是否可以在具有默认值的参数中赋值(作为可选参数)
- 对 const 引用参数使用默认值会导致崩溃
- 为什么我需要将默认引用参数定义为 const 以便为其分配一个左值?
- 指针参数的默认值
- C++中出现意外的编译错误:将默认值传递给函数参数
- 我可以在哪里放置参数的默认值
- 如何在C++中设置std::list参数的默认值?
- 具有默认值的参数的自动类型扣除
- Clang vs GCC - 可变参数模板参数包后跟默认值参数在 GCC 4.8 中有效,但在 Clang 3.5 中无
- c++变长函数中默认值参数的位置
- 将函数指针上的参数与默认值参数一起丢弃是否有效