与模板功能相比,指针衰减具有更高的优先级



我有以下代码:

#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* )赢得了模板功能。

相关内容

  • 没有找到相关文章

最新更新