C++ Primer 5th Edition имеет фрагмент рекомендаций в конце главы 16.3 (глава обсуждения шаблона функции перегрузки):Декларирование шаблоны функций перед определением при перегрузке
Declare каждая функция перегрузки устанавливается, прежде чем определить любой из функций . Таким образом, вам не нужно беспокоиться о том, будет ли компилятор выполнить вызов, прежде чем он увидит функцию, которую вы намеревались вызывать.
Так это говорит мне, что при выборе кандидата и жизнеспособных функций при разрешении перегрузки возможно, что компилятор может создать шаблон функции, который не выбран в конце? Я пытался увидеть, может ли это на самом деле произошло:
template<class> struct always_false : std::false_type {};
template <typename T> void test(T const &){
static_assert(always_false<T>::value, "If this fires, it is instantiated");
}
template <typename T> void test(T*) { }
int main(){
int *q = nullptr;
test(q); //test(T*) should be the best match
}
Эта программа будет бросать ошибку компиляции, если test(T const &)
был экземпляр в любой форме, за исключением того, программа компилируется нормально, как и ожидалось. Итак, какая ошибка компиляции - это тот наконечник, который пытается защитить меня? Когда это когда-нибудь создаст функцию, прежде чем она увидит функцию, которую я пытался вызвать?
Связанные статьи по шаблону функции специализации и перегрузки: [? Почему не Специализируются шаблоны функций] (http://gotw.ca/publications/mill17.htm) – MicroVirus