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
函数一样处理多个模板?即,它从许多定义中选择一个,并且具有不同的定义导致UB?https://stackoverflow.com/a/66356946
3-为什么int get(){}
不会导致链接错误?模板函数和正则函数有不同的符号吗?
具有不同定义的模板函数是否会导致未定义的行为?
是。
1-即使不使用extern,模板是否默认具有外部链接?
是的,模板函数具有外部链接,除非在匿名命名空间中声明,或者声明为static
,或者附加到模块并且不导出。
2-链接器是否像内联函数一样处理多个模板?
是。在这方面,函数模板的隐式实例化与内联函数的处理方式相同。
并且具有不同的定义导致UB
是。从技术上讲,这个程序是格式错误的,但在运行时,它们之间的区别并不重要。
3-为什么int get(){}不会导致链接错误?
用函数重载函数模板的格式很好。
具有不同定义的模板函数是否会导致未定义的行为
答:嗯,是的,如果你用多种方式定义模板,它们的行为确实是未定义的。应该只有一个定义
BUT
You can use template in some other scope in with different definition
即使不使用外部链接,模板是否默认具有外部链接答案:
Yes,
Templates will cause external linkage in normal circum stances but some exceptions are
Defining them in some outer namespace or using them as an exports.module
链接器是否将多个模板视为内联函数?即,它从许多定义中选择一个并具有不同的定义答案:显然,模板被视为一个内联函数