Частичная спецификация шаблонной функции в 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. Поскольку он, кажется, широко поддерживается компиляторами, держу пари, что он является частью стандарта, но может ли кто-нибудь это подтвердить? У кого-нибудь есть ссылки или ссылки на ресурсы, которые могут объяснить, почему это работает?

Ответы на вопрос(1)

Ваш ответ на вопрос