Страницы

Поиск по вопросам

пятница, 14 февраля 2020 г.

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

#cpp #шаблоны_с++


#include 

template
void foo(T...) {std::cout << 'A';}

template
void foo(T...) {std::cout << 'B';}

int main() {
  foo(1);   // prints A
  foo(1,2); // prints B
}


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


Ответы

Ответ 1



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

Комментариев нет:

Отправить комментарий