【发布时间】:2021-08-30 20:18:59
【问题描述】:
0.cc
template <class T>
T get(){
return 5;
}
int get(){
return 6;
}
int main(){
return get<int>();
}
1.cc
template <class T>
T get(){
return 7;
}
template int get<int>(); // This forces code generation.
使用g++ -Wall 0.cc 1.cc 编译不会导致链接错误,返回的输出是5。
问题
1- 即使不使用extern,模板是否默认具有外部链接?
https://en.cppreference.com/w/cpp/language/storage_duration
上面未列出的所有模板的名称(即不是声明为静态的函数模板)。
2- 链接器是否处理多个模板,如inline 函数?即它从许多定义中选择 1 个并且具有不同的定义会导致 UB?
https://stackoverflow.com/a/66356946
3- 为什么int get(){} 不会导致链接错误?模板函数和常规函数有不同的符号吗?
【问题讨论】:
-
ODR 已损坏...程序格式错误,无需诊断。
-
这是三个不同的问题。而且它们并没有太大的关系。
-
@StoryTeller-UnslanderMonica 当我试图理解它是如何以及为什么编译时,它们有点相关。
-
这不会使它们相关,因为每个问题规则一个问题stackoverflow.com/help/closed-questions
标签: c++ undefined-behavior one-definition-rule