Неоднозначный вызов шаблонных функций

165
09 мая 2019, 14:30
#include <iostream>
template<typename T>
void foo(T...) {std::cout << 'A';}
template<typename... T>
void foo(T...) {std::cout << 'B';}
int main() {
  foo(1);   // prints A
  foo(1,2); // prints B
}

Как правильно вызывать каждую из функций? Почему в первом случае вызывается первая функция, а во втором - вторая?

Answer 1

Правила overload resolution в полном объеме довольно сложны, но в таких случаях работают в основном следующие правила

  1. Преобразование аргумента к параметру ... (ellipsis conversion sequence) обладает наименьшим рангом, т.е. является наименее предпочтительным по сравнению с другими преобразованиями.

  2. Шаблонная функция с "конкретным" шаблонным параметром typename T является более специализированной и более предпочтительной, чем функция с параметром, полученным из parameter pack typename... T.

По эти правилам, например, вызов foo(1) вообще никак не вовлекает в рассмотрение параметры ... первого варианта. То есть решение принимается только на основе одного аргумента. Первый вариант выигрывает по правилу 2.

Вызов foo(1, 2) в первом варианте требует ellipsis conversion sequence для преобразования аргумента 2 к параметру .... Во втором варианте ничего подобного не требуется. По правилу 1 вызывается второй вариант.

READ ALSO
Покраска строки в QTableView

Покраска строки в QTableView

Мне нужно покрасить строку в QTableViewЯ использую QSqlQueryModel

211
Арифметика двух чисел и знака [закрыт]

Арифметика двух чисел и знака [закрыт]

Подскажите как можно решить мою проблемуНужно передать два числа и знак(+ или - или *) на сервер ( по технологии RMI), где он складывает эти два...

167