Предположим, следующее определение шаблона (код не имеет смысла):
template<class X, class Y>
bool FooBar(const Y& val) { return sizeof(X) + 4; }
Я обнаружил, что следующий код вызова был допустимым:
float temp = 0.f;
FooBar<int>(temp);
Как видите, второйпараметр типа Y
может быть опущен.Компилятор определяет тип Y
, просматривая тип аргумента temp
.
Какое правило или спецификация шаблона C ++ допускает это?Я был очень удивлен, увидев это.