模板特化和实例化

11

这些概念对我来说有点不清楚。在N4296::14.7 [temp.spec]中,模板实例化的定义已经很清晰了:

实例化函数、类、类模板或成员模板的行为称为模板实例化。

如果我们有一个函数/变量/类模板,那么模板的实例化就是创建一个对象或函数。例如:

template<typename T> class U{ };
U<int> a; //instantiation

但是 N4296:14.7.1 [temp.inst] 指出(我强调):

除非类模板特化已经被显式实例化(14.7.2)或显式专门化(14.7.3),否则当在需要完全定义的对象类型的上下文中引用该特化时,或者当类类型的完整性影响程序语义时,类模板特化将隐式实例化。

什么是模板特化的实例化定义,而不仅仅是模板的实例化?


对于第一个情况,编译器不会隐式实例化已经显式实例化过的模板定义;对于第二个情况,如果给定的参数匹配到了更为特化的一个,则编译器将不会实例化一个模板定义。 - jthill
2个回答

8

问题:

什么是模板特化的实例化,而不仅仅是模板的实例化?

我的理解:

不存在模板的实例化,你总是实例化一个模板特化。

如果你有:

template <typename T> struct Foo {};

Foo<int> foo;

您实例化了模板特化Foo<int>,而不是模板 Foo

更新

假设您有以下类模板:

template <typename T> struct Foo
{
   static int a;
};

int getNext()
{
   static int n = 0;
   return ++n;
}

template <class T> int Foo<T>::a = getNext();

显式模板实例化

您可以使用以下方法创建Foo<char>Foo<int>的显式实例化:

template struct Foo<char>;
template struct Foo<int>;

即使在您的代码中没有其他地方使用Foo<char>Foo<int>,类模板也会为charint进行实例化。

显式模板特化

您可以使用以下方法创建类模板的显式特化:

template <> Foo<double> {};

Foo的使用

现在,让我们来看一下Foo的使用。

Foo<int> f1;    // An explicit instantiation has already been created.
                // No need for any further code creation.

Foo<double> f2; // An explicit specialization has already been created.
                // No need for any further code creation.

Foo<long> f3;   // There is no explicit instantiation or explicit specialization
                // Code needs to be created for Foo<long>

           

第三种情况,Foo<long> f3; 触发创建模板特化 Foo<long>。我理解短语 "class template specialization is implicitly instantiated" 意味着 "从类模板创建 Foo<long>。"

2
“模板实例化”是指实例化函数、类、类模板或成员模板的行为。因此,“没有模板实例化这种东西”这个说法是否正确呢?请注意,N4296::14.7 [temp.spec] 的第一句话告诉我们这一点。 - user2953119
@DmitryFucintv,说得好。让我仔细阅读标准的这些部分。 - R Sahu
有趣,谢谢。但是你能不能再澄清一个概念。我们有两个不同的概念:部分特化显式特化。我们可以说显式特化总是部分特化吗? - user2953119
1
@DmitryFucintv,部分特化既不是显式实例化也不是显式特化。就本讨论而言,部分特化与普通类模板没有区别。 - R Sahu

-1
“实例化模板特化”通常指隐式实例化的过程:将特定的模板参数代入模板定义中,以获得实例化的类、函数等。实例化模板意味着实例化该模板的特化。通常,在我们谈论语言法律文书的上下文中,使用不太精确的措辞来描述任意实例化。您还会发现“模板实例化”的表达方式,它与实例化的特化是同义词。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接