显式模板实例化定义是否也抑制隐式实例化

Does explicit template instantiation definition also suppress implicit instantiation?

本文关键字:实例化 定义 是否      更新时间:2023-10-16

我知道显式实例化声明会抑制后面的隐式实例化。但是如果只有显式的实例化定义呢?它是否也会抑制后面的隐式实例化?

例如:

#include <vector>
template class std::vector<int>;  // Explicit template instantiation definition.
int main() {
    std::vector<int> a;  // Implicit instantiation.
}

显式模板实例化定义是否抑制了后面的隐式实例化?我知道,如果我通过在extern关键字前添加显式定义到声明中,则隐式实例化将被抑制。

在c++中11看到[temp.inst]/1:

除非类模板特化已经被显式实例化(14.7.2)或显式特化(14.7.3),当在上下文中引用类模板专门化时,将隐式实例化该类模板专门化这需要完全定义的对象类型,或者当类类型的完整性影响对象类型时节目的狂人。[…]

因此,如果一个特定的特化类模板被显式实例化,它不会被隐式实例化。注意"专门化"。在标准中包含了大多数程序员所说的"实例化"。通用版本的。当你为一组特定的模板参数声明一个单独的版本时,它被称为"显式特化"。

在这种情况下,如果没有显式实例化,则会发生隐式实例化,因为您使用类类型的方式要求它是完整的。

请注意,这一段没有区分显式实例化声明和显式实例化定义。实际上,当模板专门化被显式实例化时,无论它是显式实例化定义还是显式实例化声明,都需要提供类模板的完整定义。但是,类模板专门化的显式实例化定义和显式实例化声明之间的区别在于,显式实例化定义还将实例化类模板专门化的所有成员函数和静态数据成员的定义,而显式实例化声明只实例化它们的声明。在后一种情况下,成员函数和静态数据成员的定义可能会在稍后的翻译单元中隐式实例化。

相关文章: