【问题标题】:What does template's implicit specialization mean?模板的隐式特化是什么意思?
【发布时间】:2015-02-23 08:06:31
【问题描述】:

在章节N3797::14/4 [temp](强调我的)

模板名称具有链接 (3.5)。非成员函数模板可以 有内部联系;任何其他模板名称应具有外部 连锁。模板的特化(显式或隐式) 具有内部联系,不同于其他领域的所有专业 翻译单位。

提到了隐式专业化。据我从上下文中了解到,该概念与具有

的模板显式专业化不同

template < >声明

语法。所以,我猜测隐式特化与部分类模板特化有关。不幸的是,我无法在当前工作草案中定义隐式专业化概念的规范性参考。

【问题讨论】:

  • 当然,它只是意味着除显式专业之外的所有专业

标签: c++ templates


【解决方案1】:

没有称为“隐式专业化”的规范术语。
但是,我认为在这种情况下,它意味着“显式专业化”的补充:用户未明确专业化的每个专业化,换句话说,实例化专业化
考虑到有

  • 明确的专业化
  • 隐式实例化
  • 显式实例化

通过后两者实例化的特化可以称为“隐式特化”。

【讨论】:

  • 好吧,如果我们对模板应用显式特化,对应的类/函数定义是否会被放入已编译的目标文件中?
  • 只是为了澄清,我认为如果我们对类模板应用部分特化,任何类定义都不会被放入对象文件中,除非它被实例化(隐式/显式)。我说的对吗?
  • @DmitryFucintv 部分特化是一个模板,如果它没有被实例化,那么它对程序的影响将与未实例化的主模板一样。
【解决方案2】:

该术语在标准中使用不多,但我们可以从 §14.5.5.3 中推断出它的含义 - 转载如下 - 为了方便起见,我将其分为 (A)、(B) 和 (C) 段参考(粗体字):

(A) 如果类模板的成员模板是部分特化的,则成员模板的部分特化是封闭类模板的成员模板;如果封闭类模板被实例化(14.7.1、14.7.2),则每个成员模板部分特化的声明也被实例化,作为创建类模板特化成员的一部分。

(B) 如果主成员模板被显式特化为封闭类模板的给定(隐式)特化,则对于封闭类的这种特化,成员模板的部分特化将被忽略模板。

(C) 如果成员模板的部分特化显式特化为封闭类模板的给定(隐式)特化,则仍会考虑主成员模板及其其他部分特化封闭类模板的这种特化。 [ 例子:

template<class T> struct A {
    template<class T2> struct B {}; // #1
    template<class T2> struct B<T2*> {}; // #2
};
template<> template<class T2> struct A<short>::B {}; // #3

A<char>::B<int*> abcip; // uses #2
A<short>::B<int*> absip; // uses #3
A<char>::B<int> abci; // uses #1

-- 结束示例]

重复(B)我对括号中示例的交叉引用:

"如果主成员模板(即#1)对于封闭类模板的给定(隐式)特化显式特化(如#3)A),成员模板的部分特化 (#2) 对于封闭类模板的这种特化被忽略"。

我们看到 #3 的专业化导致忽略 absip; 的 #2。因此,我们可以得出以下结论...

template<> template<class T2> struct A<short>::B {}; // #3

...执行封闭类模板的隐式特化,即A&lt;short&gt;

因此,隐式特化是指成员函数的特化隐含地涉及其所属的类模板的特化。换句话说,类模板A 不需要在#1 的成员模板被特化之前对short 进行单独的早期特化,因为它可以被隐式特化。

【讨论】:

  • 我以为这叫做模板参数推导,而不是隐式特化。
  • 也许您可以提供一些规范性的参考来描述它?
  • @MattMcNabb *(模板) 参数推导。
猜你喜欢
  • 2010-09-29
  • 2022-09-23
  • 2011-01-07
  • 1970-01-01
  • 1970-01-01
  • 2010-10-04
  • 2015-07-12
  • 2021-10-29
  • 1970-01-01
相关资源
最近更新 更多