В C++, скажем, у вас есть два определения функций:
template <typename T>
T square (T num);
А также
double square(double num);
и у вас есть вызов функции, например:
square(1.5);
какую функцию вызывать? Что выбирает компилятор?
В этом случае C++ всегда предпочитает нестратегированную версию функции, так как она может легко продвигать float в double.
Если бы вы использовали это:
float p = 2.2;
square(p);
компилятор выбрал бы шаблонную версию в своем стремлении к идеальной игре.
1.5
интерпретируется как double
, поэтому будет вызвана его вторая функция. Если бы он определил второй square
чтобы взять поплавок, шаблон будет использоваться.
Аргумент 1.5
имеет тип double
поэтому он точно соответствует шаблону и не шаблону. В таком случае нестандартная функция будет предпочтительной в соответствии с [over.best.match] в стандарте:
...
F1
определен как лучшая функция, чем...F2
если...F1
не является специализированной функцией шаблона, аF2
- специализированной функцией шаблона...
Если вы вызвали square
с аргументом int
или float
, шаблон снова даст точное совпадение, но вам понадобится преобразование или продвижение для не-шаблона. Шаблон будет выбран, так как он лучше соответствует.
Поскольку синтаксис вызова соответствует функции без шаблона, поэтому он будет вызываться