从模板实例化的专业化的 ODR 规则怎么样?

jac*_*k X 7 c++ templates language-lawyer c++17

//Tpl.h
template<typename T>
void show(T){
}
Run Code Online (Sandbox Code Playgroud)
// a translate unit
#include "Tpl.h"
void h(){
  show(0);  //implicitly instantiate specialization for show<int>
}
Run Code Online (Sandbox Code Playgroud)
// b translate unit
#include "Tpl.h"
int main(){
  show(0);  //implicitly instantiate specialization for show<int>
}
Run Code Online (Sandbox Code Playgroud)

根据[temp.inst]中的规则,函数模板showinabtranslate unit分别有一个特化,这意味着一个程序中有两个相同的特化。

但是,该ODR规则没有提及这种情况。
basic.def.odr#6

一个类类型、枚举类型、带有外部链接的内联函数([dcl.inline])、带有外部链接的内联变量([dcl.inline])、类模板、非静态函数模板,可以有多个定义,类模板的静态数据成员、类模板的成员函数或未在程序中指定某些模板参数([temp.spec]、[temp.class.spec])的模板特化,前提是每个定义都出现在一个不同的翻译单元,并提供定义满足以下要求。给定在多个翻译单元中定义的名为 D 的实体,则

规则列出的情况如下:

  • 班型
  • 枚举类型
  • 内联函数或内联变量
  • 类模板
  • 非静态函数模板
  • 类模板的静态数据成员
  • 类模板的成员函数
  • 未指定某些模板参数的模板特化

那么,怎么样function templatestatic member function template

它也不涵盖程序中模板存在多个相同特化的情况,上面列表中的最后一项似乎是指template partial specializations,那么这是缺陷吗?或者还有其他特殊规则适用于这种情况?