我有以下代码:
#include <iostream>
template <typename T>
void foo(const T& v) { //version 1
std::cout << __PRETTY_FUNCTION__ << std::endl;
}
void foo(char* v) {//version 2
std::cout << __PRETTY_FUNCTION__ << std::endl;
}
void foo(const char* v) {//version 3
std::cout << __PRETTY_FUNCTION__ << std::endl;
}
int main() {
char s1[] = "1234";
const char* s2 = "2345";
foo(s1);
foo(s2);
}
输出为:
void foo(char*)
void foo(const char*)
我认为s1
需要经历指针衰减,因此模板函数foo()
是更好的选择。
如果删除第二个foo()
的声明和定义,则编译器选择不进行指针衰减,并选择模板函数foo()
。
现在,我很困惑编译器选择绑定到/调用哪个函数的规则。
谢谢!
答案 0 :(得分:3)
该行为由过载解析规则控制,该规则非常复杂。在这里可以找到不错的文章:https://en.cppreference.com/w/cpp/language/overload_resolution
对于您的特殊情况,具有隐式转换的非模板函数foo(char* )
胜过模板函数。