指针衰变比模板函数具有更高的优先级?

时间:2019-06-25 12:59:18

标签: g++ c++17

我有以下代码:

#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()

现在,我很困惑编译器选择绑定到/调用哪个函数的规则。

谢谢!

1 个答案:

答案 0 :(得分:3)

该行为由过载解析规则控制,该规则非常复杂。在这里可以找到不错的文章:https://en.cppreference.com/w/cpp/language/overload_resolution

对于您的特殊情况,具有隐式转换的非模板函数foo(char* )胜过模板函数。