这些概念对我来说有点不清楚.好吧,模板实例化的定义非常好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),否则在需要完全定义的对象类型或完整性的上下文中引用特化时,将隐式实例化类模板特化.类类型会影响程序的语义.
模板特化的实例化定义是什么,而不仅仅是模板的实例化?
题:
模板特化的实例化的定义是什么,而不仅仅是模板的实例化?
我的理解:
没有模板的实例化之类的东西。你总是实例化一个模板特化。
如果你有:
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>
从类模板创建”。.
Col*_*mbo -1
“实例化模板特化”通常是指隐式实例化的过程:将特定的模板参数替换到模板定义中以获得实例化的类、函数等。实例化模板意味着实例化该模板的特化。通常,当我们在语言律师的背景下谈论一些任意实例时,会使用不太精确的措辞。您还会发现表达式“模板的实例化”,它与实例化专业化同义。