У меня есть следующий код:
#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.
Спасибо!