Распад указателя с более высоким приоритетом, чем функция шаблона? - PullRequest
1 голос
/ 25 июня 2019

У меня есть следующий код:

#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() лучше всего подходит.

Если я удаляю 2-е объявление и определение foo(), то компилятор решает не проходить через затухание указателя и выбирает функцию шаблона foo().

Теперь я запутался, каково правило для компилятора выбирать, какую функцию связывать с / call.

Спасибо!

1 Ответ

3 голосов
/ 25 июня 2019

Такое поведение регулируется правилами разрешения перегрузки, которые довольно сложны.Хорошая статья может быть найдена здесь: https://en.cppreference.com/w/cpp/language/overload_resolution

В вашем конкретном случае не шаблонная функция foo(char* ) с неявным преобразованием выигрывает у шаблонной функции.

...