Częściowa specyfikacja funkcji szablonu w C ++ działa, ale dlaczego?

Próbuję dowiedzieć się, czy częściowa specyfikacja funkcji szablonowych jest częścią standardu C ++ lub czy jest to coś specyficznego dla kompilatora.

Przez częściową specyfikację mam na myśli określenie tylko typów, których kompilator nie może wywnioskować. Jeśli więc mam funkcję szablonu „f”, która przyjmuje 3 typy, a jedna jest używana w parametrze i można ją wywnioskować, mogę nazwać „f” za pomocą formularzaf<type, type>(parameter)

Oto przykład:

#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;
}

Przetestowałem to z g ++ 4.5.3, g ++ 4.6.3, VS2010 i VS2012. Ponieważ wydaje się, że jest on szeroko wspierany przez kompilatory, obstawiam, że jest to część standardu, ale czy ktoś może to potwierdzić? Czy ktoś ma jakieś linki lub wskazówki do zasobów, które mogłyby wyjaśnić, dlaczego to działa?

questionAnswers(1)

yourAnswerToTheQuestion