具有不同定义的模板函数是否会导致未定义的行为



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

链接器是否将多个模板视为内联函数?即,它从许多定义中选择一个并具有不同的定义答案:显然,模板被视为一个内联函数

相关内容

  • 没有找到相关文章