显式模板实例化定义是否也抑制隐式实例化
Does explicit template instantiation definition also suppress implicit instantiation?
我知道显式实例化声明会抑制后面的隐式实例化。但是如果只有显式的实例化定义呢?它是否也会抑制后面的隐式实例化?
例如:#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),当在上下文中引用类模板专门化时,将隐式实例化该类模板专门化这需要完全定义的对象类型,或者当类类型的完整性影响对象类型时节目的狂人。[…]
因此,如果一个特定的特化类模板被显式实例化,它不会被隐式实例化。注意"专门化"。在标准中包含了大多数程序员所说的"实例化"。通用版本的。当你为一组特定的模板参数声明一个单独的版本时,它被称为"显式特化"。
在这种情况下,如果没有显式实例化,则会发生隐式实例化,因为您使用类类型的方式要求它是完整的。
请注意,这一段没有区分显式实例化声明和显式实例化定义。实际上,当类模板专门化被显式实例化时,无论它是显式实例化定义还是显式实例化声明,都需要提供类模板的完整定义。但是,类模板专门化的显式实例化定义和显式实例化声明之间的区别在于,显式实例化定义还将实例化类模板专门化的所有成员函数和静态数据成员的定义,而显式实例化声明只实例化它们的声明。在后一种情况下,成员函数和静态数据成员的定义可能会在稍后的翻译单元中隐式实例化。
相关文章:
- 对显式实例化的模板函数的未定义引用
- 未定义的类模板不会实例化以检查友元函数
- 将自定义 QMap 模板实例化以人类可读的形式保存在 QSettings 中
- OSX clang++:用于 cpp 文件中显式实例化模板的体系结构x86_64的未定义符号
- 何时需要实例化函数模板定义?
- 使用用户定义的类型 UDT 实例化 std::atomic<>。如果 UDT 具有虚函数,则 l 墨水将失败。为什么?
- 实例化具有不完整类型的类模板格式不正确(如果该类型是在之后定义的)
- 将类成员函数的模板定义放在 CPP 文件中C++隐式实例化而不是 .H 允许吗?
- 有没有办法根据命令行参数定义数组大小?运行时与编译时实例化?
- XCode 警告"此处需要实例化变量'Singleton:<Foo>:_instance',但没有可用的定义
- 即使我正在.cpp文件中实例化一个伪对象,.cpp文件内模板函数的定义也不起作用
- 没有为显式模板实例化请求提供合适的定义
- 如何键入定义一个专门的 std::set 模板,使用特定的比较函数实例化
- unique_ptr 使用尚未定义的参数进行实例化不会导致错误
- 为什么找不到使用命名空间中定义的类型实例化的 std::weak_ptr 的重载运算符==?
- 如何严格定义函数模板显式实例化规则
- gcc 中的模板显式实例化(定义和声明)
- c++ 11:显式实例化声明vs显式实例化定义
- 当显式模板实例化定义在显式声明之前时,GCC和clang不同意
- 显式模板实例化定义是否也抑制隐式实例化