模板专业化和实例化

7 c++ templates

这些概念对我来说有点不清楚.好吧,模板实例化的定义非常好N4296::14.7 [temp.spec]:

实例化函数,类,类模板或成员模板的成员的行为称为模板实例化.

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

template<typename T> class U{ };
U<int> a; //instantiation
Run Code Online (Sandbox Code Playgroud)

但是N4296:14.7.1 [temp.inst]说(强调我的):

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

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

R S*_*ahu 5

题:

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

我的理解:

没有模板的实例化之类的东西。你总是实例化一个模板特化。

如果你有:

template <typename T> struct Foo {};

Foo<int> foo;
Run Code Online (Sandbox Code Playgroud)

您已经实例化了模板特化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();
Run Code Online (Sandbox Code Playgroud)

显式模板实例化

您可以创建明确的实例Foo<char>,并Foo<int>通过:

template struct Foo<char>;
template struct Foo<int>;
Run Code Online (Sandbox Code Playgroud)

即使Foo<char>Foo<int>未在代码中的任何其他地方使用,类模板也会为char和实例化int

显式模板特化

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

template <> Foo<double> {};
Run Code Online (Sandbox Code Playgroud)

用于 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>

           
Run Code Online (Sandbox Code Playgroud)

第三种情况,Foo<long> f3;触发模板专业化的创建Foo<long>。我将短语“类模板特化隐式实例化”解释Foo<long>从类模板创建”。.

  • _不存在模板实例化之类的东西。_您确定吗?因为`N4296::14.7 [temp.spec]`的第一句话告诉我们_实例化函数、类、类模板的成员或成员模板的行为被称为**模板实例化**。 _ (2认同)

Col*_*mbo -1

“实例化模板特化”通常是指隐式实例化的过程:将特定的模板参数替换到模板定义中以获得实例化的类、函数等。实例化模板意味着实例化该模板的特化。通常,当我们在语言律师的背景下谈论一些任意实例时,会使用不太精确的措辞。您还会发现表达式“模板的实例化”,它与实例化专业化同义。