Частичная спецификация шаблонной функции в C ++ работает, но почему?

Я пытаюсь выяснить, является ли частичная спецификация шаблонных функций частью стандарта C ++ или это что-то специфичное для компилятора.

Под частичной спецификацией я подразумеваю указание только тех типов, которые компилятор не может определить. Поэтому, если у меня есть шаблонная функция ‘f’, которая принимает 3 типа, и один используется в параметре и может быть выведен, я мог бы вызвать ‘f’ с формой f<type, type>(parameter)

Вот пример:

#include <iostream>
#include <tuple>
#include <string>

template<class A, class B, class C>
std::tuple<A, B> test(C c)
{
// do something based on c, return tuple with types A and B
return std::make_tuple(A(), B());
}

int main(void)
{
// I expected I would have to use this form.  Specify all parameters.
std::tuple<int, int> value3 = test<int, int, int>(5);

// Here, I only specified the return value types, did not specify the parameter type, yet it compiles.
auto value1 = test<int, int>("c-string");

// Similar example here.  Return types specified, parameter type deduced.  Compiles fine.
auto value2 = test<std::string, int>(42);

return 0;
}

Я проверял это с g ++ 4.5.3, g ++ 4.6.3, VS2010 и VS2012. Поскольку он, кажется, широко поддерживается компиляторами, держу пари, что он является частью стандарта, но может ли кто-нибудь это подтвердить? Есть ли у кого-нибудь ссылки или ссылки на ресурсы, которые могут объяснить, почему это работает?

13

Решение

Пункт 14.8.1.2 стандарта C ++ 03 заявляет

«Конечные аргументы шаблона, которые могут быть выведены (14.8.2), могут быть опущены из списка явных аргументов шаблона».

14

Другие решения

Других решений пока нет …

По вопросам рекламы [email protected]