Подтвердить что ты не робот

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

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

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

Спасибо

4b9b3361

Ответ 1

Пункт 14.8.1.2 стандартных состояний С++ 03

"Трейлинг аргументов шаблона, которые могут быть выведены (14.8.2), может быть опущен из списка явных аргументов шаблона."