类模板专用化中模板参数的默认值

Default values of template parameters in the class template specializations

本文关键字:默认值 参数 专用      更新时间:2023-10-16

请考虑以下代码:

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* 之外的任何指针类型时,将使用第一个部分专用化。

在程序中,qq1qq2都使用 int* 作为第二个模板参数(显式或使用默认参数),因此都选择第二个实例化。