c++ 显式模板示例化定义是否也抑制隐式示例化?

vwkv1x7d  于 2023-05-02  发布在  其他
关注(0)|答案(1)|浏览(104)

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

#include <vector>

template class std::vector<int>;  // Explicit template instantiation definition.

int main() {
    std::vector<int> a;  // Implicit instantiation.
}

显式模板示例化定义是否会抑制后面的隐式示例化?我知道,如果我通过前置extern关键字将显式定义放入声明中,隐式示例化将被抑制。

kgsdhlau

kgsdhlau1#

在C++11中,参见[temp.inst]/1:
除非类模板专门化已经被显式地示例化(14.7.2)或明确专门化(14.7.3),当在需要完全定义的对象类型的上下文中引用专门化时,或者当类类型的完整性影响程序的语义时,类模板专门化被隐式地示例化。[...]
因此,如果类模板的特定特化被显式示例化,它不会被隐式示例化。请注意,标准中的“专门化”包括大多数程序员所称的泛型版本的“示例化”。当您为一组特定的模板参数声明一个单独的版本时,它被称为“显式专门化”。
在这种情况下,如果没有显式示例化,隐式示例化 * 就会 * 发生,因为您正在以一种要求完整的方式使用类类型。
请注意,这一特定段落并不区分显式示例化声明和显式示例化定义。实际上,当 class 模板专门化被显式地示例化时,无论它是显式的示例化定义还是显式的示例化声明,类模板的完整定义都需要可用。但是类模板专门化的显式示例化定义和显式示例化声明之间的区别在于,显式示例化定义还将示例化类模板专门化的所有成员函数和静态数据成员的定义,而显式示例化声明将仅示例化它们的声明。在后一种情况下,成员函数和静态数据成员的定义可能会在翻译单元中的稍后点进行隐式示例化。

相关问题