首页
学习
活动
专区
工具
TVP
发布
社区首页 >问答首页 >使用` `extern template`防止模板类的隐式实例化

使用` `extern template`防止模板类的隐式实例化
EN

Stack Overflow用户
提问于 2019-06-05 01:11:00
回答 2查看 392关注 0票数 6

考虑下面的代码片段:

代码语言:javascript
复制
template <typename>
struct X { };

extern template struct X<int>;

int main()
{
    X<int>{};
}

它编译并链接:。由于extern template声明,我希望它不会链接。

我的理解是,extern template的意思是:“请不要在这个TU中实例化这个特定的模板专门化,它将由其他TU提供,您可以链接到它”。

示例/描述。我在isocpp和cppreference上看到的似乎验证了我的心理模型。例如。

来自https://en.cppreference.com/w/cpp/language/class_template

显式实例化声明(外部模板)跳过隐式实例化步骤:将导致隐式实例化的代码改为使用在别处提供的显式实例化定义(如果不存在此类实例化,则会导致链接错误)。通过在使用模板实例化的所有源文件中显式声明模板实例化,并在其余文件中显式定义模板实例化,可以使用这种方法来减少编译时间。

为什么我的代码片段链接?这里到底发生了什么?

编辑-在最新的标准草案中找到以下内容:

[temp.explicit]

如果一个实体在同一翻译单元中同时是显式实例化声明和显式实例化定义的主体,则定义应跟随在声明之后。如果实体是显式实例化声明的主题,并且其使用方式也会导致转换单元中的隐式实例化,则该实体应成为程序中某处显式实例化定义的主题;否则,该程序的格式不正确,不需要诊断。

这是否意味着我发布的代码片段是格式错误的,NDR

EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/56448493

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档