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]中的规则,函数模板showina和btranslate unit分别有一个特化,这意味着一个程序中有两个相同的特化。
但是,该ODR规则没有提及这种情况。
basic.def.odr#6
一个类类型、枚举类型、带有外部链接的内联函数([dcl.inline])、带有外部链接的内联变量([dcl.inline])、类模板、非静态函数模板,可以有多个定义,类模板的静态数据成员、类模板的成员函数或未在程序中指定某些模板参数([temp.spec]、[temp.class.spec])的模板特化,前提是每个定义都出现在一个不同的翻译单元,并提供定义满足以下要求。给定在多个翻译单元中定义的名为 D 的实体,则
规则列出的情况如下:
- 班型
- 枚举类型
- 内联函数或内联变量
- 类模板
- 非静态函数模板
- 类模板的静态数据成员
- 类模板的成员函数
- 未指定某些模板参数的模板特化
那么,怎么样function template或static member function template?
它也不涵盖程序中模板存在多个相同特化的情况,上面列表中的最后一项似乎是指template partial specializations,那么这是缺陷吗?或者还有其他特殊规则适用于这种情况?
| 归档时间: |
|
| 查看次数: |
86 次 |
| 最近记录: |