考虑下面的代码片段:
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的
:
显式实例化声明(外部模板)跳过隐式实例化步骤:将导致隐式实例化的代码改为使用在别处提供的显式实例化定义(如果不存在此类实例化,则会导致链接错误)。通过在使用模板实例化的所有源文件中显式声明模板实例化,并在其余文件中显式定义模板实例化,可以使用这种方法来减少编译时间。
为什么我的代码片段链接?这里到底发生了什么?
编辑-在最新的标准草案中找到以下内容:
如果一个实体在同一翻译单元中同时是显式实例化声明和显式实例化定义的主体,则定义应跟随在声明之后。如果实体是显式实例化声明的主题,并且其使用方式也会导致转换单元中的隐式实例化,则该实体应成为程序中某处显式实例化定义的主题;否则,该程序的格式不正确,不需要诊断。
这是否意味着我发布的代码片段是格式错误的,NDR
https://stackoverflow.com/questions/56448493
复制相似问题