Разрешение перегрузки не выбирает шаблон, когда аргументы разные - PullRequest
2 голосов
/ 28 апреля 2019

Почему третий вызов функции f не использует шаблон функции?

#include <iostream>
using namespace std;

template<class T> void f(T x, T y) { cout << "Template" << endl; }

void f(int w, int z) { cout << "Non-template" << endl; }

int main() {
   f( 1 ,  2 );
   f('a', 'b');
   f( 1 , 'b');
}

Ответы [ 3 ]

2 голосов
/ 28 апреля 2019

Вывод типа шаблона функции очень строг.Для каждой пары параметров функции и аргумента вычет происходит изолированно, а затем сравниваются результаты вычета:

[temp.deduct.type]

2 В некоторых случаях вычет выполняется с использованием одного набора типов P и A, в других случаях будет набор соответствующих типов P и A. Вычитание типа выполняется независимо для каждого P / A.пара, и выведенные значения аргумента шаблона затем объединяются.Если выведение типа не может быть выполнено для любой пары P / A, или если для любой пары вычет приводит к более чем одному возможному набору выводимых значений, или если разные пары дают разные выведенные значения, или если какой-либо аргумент шаблона не остается ни выведенным, ни явноуказан, шаблонный вывод аргумента завершается неудачей.

Это означает, что тип x выводится из 1 (и int), а тип y выводится из 'b' (символ), как будто другой параметр не существует.Это вычитание дает T = int и T = char по отдельности, и, поскольку это разные типы, вычет должен явно потерпеть неудачу в соответствии с вышеприведенным абзацем.

Если вы хотите вызвать экземплярную функцию, вынеобходимо явно указать T:

f<int>( 1 , 'b');
f<char>( 1 , 'b');
0 голосов
/ 28 апреля 2019

В третьем вызове первый аргумент является int, а второй - char, следовательно, он не соответствует объявлению шаблона. Однако, char можно косвенно преобразовать в int, тогда называется специализация.

0 голосов
/ 28 апреля 2019

В третьем вызове два аргумента имеют разные типы, поэтому T не может быть выведено, и функция шаблона не является жизнеспособной.Тогда не шаблонный является единственным жизнеспособным кандидатом.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...