具有不同定义的模板函数是否会导致未定义的行为?
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?
用函数重载函数模板是合式的。
具有不同定义的模板函数是否会导致未定义的行为?
Answerr:嗯,是的,如果您以多种方式定义模板,它们确实会表现得未定义。
应该只有一个定义
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 个并具有不同的定义
回答:
显然,模板被视为内联函数
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?
用函数重载函数模板是合式的。
具有不同定义的模板函数是否会导致未定义的行为?
Answerr:嗯,是的,如果您以多种方式定义模板,它们确实会表现得未定义。 应该只有一个定义
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 个并具有不同的定义 回答: 显然,模板被视为内联函数