#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
(здесь - сфины)?