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

Does a template function with different definitions cause undefined behaviour?

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 编译不会导致 link 错误,返回的输出为 5.

问题

1- 即使未使用 extern,模板是否默认具有外部 linkage?

https://en.cppreference.com/w/cpp/language/storage_duration

names of all templates not listed above (that is, not function templates declared static).

2- linker 是否像 inline 函数一样处理多个模板?即它从许多定义中选择 1 个并且具有不同的定义会导致 UB?

3- 为什么 int get(){} 不会导致 link 错误?模板函数和常规函数有不同的符号吗?

Does a template function with different definitions cause undefined behaviour?

是的。

1- Do templates have external linkage by default even if extern isn't used?

是的,模板函数具有外部链接,除非在匿名命名空间中声明或声明 static 或附加到模块且未导出。

2- Does the linker treat multiple templates like inline functions?

是的。在这方面,函数模板的隐式实例化与内联函数相同。

and having different definitions causes UB

是的。从技术上讲,该程序格式错误,但它们之间的区别在运行时并不重要。

3- Why doesn't int get(){} cause a link error?

用函数重载函数模板是合式的。

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

A​​nswerr:嗯,是的,如果您以多种方式定义模板,它们确实会表现得未定义。 应该只有一个定义

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

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