каков порядок создания шаблона функции, замены и разрешения перегрузки - PullRequest
0 голосов
/ 13 января 2020
#include <iostream>
template<typename T>
void test(T,typename T::type){  //#1
}
template<typename T,typename U>
void test(T,U){  //#2
}
int main(){
  test(0,0); //we know #2 is called
}

рассмотрим код выше, чтобы вызвать функцию test для аргументов 0,0, компилятору необходимо найти перегрузку с наилучшим соответствием для этих аргументов и создать экземпляр шаблона функции, во-первых, есть два шаблона функции с именем test, компилятор выводит параметры шаблона из аргументов для них. Я хочу знать, как выполняется экземпляр или замена, которая сначала выполняется на шаблоне функции на следующем шаге - выполняется ли после них разрешение перегрузки?

когда создавать экземпляр шаблона функции

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

когда выполнять подстановку

В частности, при создании набора кандидатов для разрешения перегрузки некоторые (или все) кандидаты из этого набора могут быть результатом созданных экземпляров шаблонов с ( потенциально выведенные) аргументы шаблона, замененные соответствующими параметрами шаблона. Если во время замены набора аргументов для какого-либо данного шаблона возникает ошибка, компилятор удаляет потенциальную перегрузку из набора кандидатов, а не останавливается с ошибкой компиляции, при условии, что ошибка замещения является единственной, которую стандарт C ++ предоставляет для такой обработки

Я не нашел документ о порядке замещения и создания экземпляра

ОБНОВЛЕНИЕ:
deduction, substitution (здесь произошла сфина) - части инстанцирования, однако, кроме этих, генерируют дефиницию путем подстановки аргументов шаблона в точке инстанцирования, также являющейся частью инстанцирования, когда это происходит? после разрешения перегрузки или после substitution (здесь - сфины)?

1 Ответ

1 голос
/ 13 января 2020

Ваш пример мало показывает ваш вопрос, поскольку существует только один жизнеспособный кандидат: замена на 1001 * не удалась, так как int::type неверно сформирован, и, следовательно, есть только одна функция, #2.

С другой стороны, это означает, что замена параметров должна происходить как часть создания экземпляра (как отмечено @IgorTandetnik). И чтобы разрешить любые перегрузки, создание шаблона должно происходить раньше.

Если вы измените #1 на

template <typename T>
void test(T,T){}

, у вас будет две жизнеспособные перегрузки, и #1 будет выбран.

Редактировать:

С другой стороны, если вы измените свою основную функцию на

struct {
   using type = int;
   int val = 0;
} x;

test(x,0);

, оба шаблона будут Создание экземпляра, но разрешение перегрузки не будет выполнено, так как две функции void test(anonymous struct, int) неоднозначны.

Это также показывает, что шаблоны должны быть созданы до разрешения перегрузки.

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