#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
}
Как правильно вызывать каждую из функций? Почему в первом случае вызывается первая функция, а во втором - вторая?
Правила overload resolution в полном объеме довольно сложны, но в таких случаях работают в основном следующие правила
Преобразование аргумента к параметру ... (ellipsis conversion sequence) обладает наименьшим рангом, т.е. является наименее предпочтительным по сравнению с другими преобразованиями.
Шаблонная функция с "конкретным" шаблонным параметром typename T является более специализированной и более предпочтительной, чем функция с параметром, полученным из parameter pack typename... T.
По эти правилам, например, вызов foo(1) вообще никак не вовлекает в рассмотрение параметры ... первого варианта. То есть решение принимается только на основе одного аргумента. Первый вариант выигрывает по правилу 2.
Вызов foo(1, 2) в первом варианте требует ellipsis conversion sequence для преобразования аргумента 2 к параметру .... Во втором варианте ничего подобного не требуется. По правилу 1 вызывается второй вариант.
Основные этапы разработки сайта для стоматологической клиники
Продвижение своими сайтами как стратегия роста и независимости