我有以下代码:
#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()
。
现在,我感到困惑的是编译器选择要绑定到/调用的函数的规则是什么。
谢谢!
该行为由过载分辨率规则控制,这很复杂。可以在此处找到一个好的文章:https://en.cppreference.com/w/cpp/language/overload_resolution
对于您的特定情况,具有隐式转换的非模板函数foo(char* )
赢得了模板功能。