У меня есть следующий код:C++ Функции перегрузки и шаблоны функций - другое поведение?
void A(const int*)
{
cout << "const int*" << endl;
}
void A(const int&)
{
cout << "const int&" << endl;
}
template <typename T>
void B(const T*)
{
cout << "const T*" << endl;
}
template <typename T>
void B(const T&)
{
cout << "const T&" << endl;
}
int main()
{
int* a = nullptr;
A(a); //output: const int*
int* b = nullptr;
B(b); //output: const T&
return 0;
}
A(a)
в вызывающей функции A(const int*)
B(b)
является вызовом функции ШАБЛОНА B(const T&)
Я не удивлен, от поведения шаблона из-за работы разрешения перегрузки в пути. Но я не могу объяснить, почему нетемпликационные функции возвращают противоположный результат (что более любопытно более интуитивно).
Это связано с тем, что с нетемплируемыми функциями нет необходимости выводить тип и считается точным совпадением (добавление константы разрешено?)?
Я не специалист по метапрограммированию и тому, что делает компилятор (например, разрешение перегрузки), и поэтому я немного смущен.
Он спрашивает, почему он звонит без шаблонов 'A' над шаблоном' A', а не почему он не называет 'B'. –
@WilliamCustode: Нет, это не так. Нет шаблонов 'A'. –
@WilliamCustode нет шаблона функции 'A'. – juanchopanza