Разрешено ли удержание нескольких аргументов шаблона в явной специализации шаблона функции? - PullRequest
2 голосов
/ 26 июня 2019

Следующая цитата из [temp.expl.spec.11] :

Трейлинг аргумент шаблона можетне указывайте в template-id имя явной специализации шаблона функции при условии, что it может быть выведено из типа аргумента функции.

указывает, что может быть выведен только единственный аргумент конечного шаблона.Что сделало бы следующий примерный код неверным:

template <typename T1, typename T2>
void f(T1, T2*);  

template<>
void f(int, double*) { }

int main()
{
    auto d = 2.0;
    f(1, &d);
}

Однако код прекрасно компилируется с GCC и Clang.Применяют ли эти компиляторы какое-либо нестандартное расширение языка, или поддерживается ли вычет для нескольких конечных аргументов ?

Если последнее верно, почему предложение не формируется следующим образом?

Конечный аргументы шаблона можно не указывать в идентификатор-шаблона с указанием явной специализации шаблона функции при условии они может быть выведено из аргумента функции типа s .

Ответы [ 2 ]

3 голосов
/ 26 июня 2019

В кавычке не указано, что можно оставить только один параметр.

Конечный аргумент шаблона можно не указывать в идентификаторе шаблона с указанием явной специализации шаблона функции при условии, что он может быть выведен из типа аргумента функции.

Означает, что (любой) параметр может быть пропущен, если он может быть выведен. Так что в

template<>
void f(int, double*) { }

Нам не нужно указывать T1, потому что он может быть выведен из int, и нам не нужно указывать T2, потому что он может быть выведен из double*.

Если бы стандарт позволял не указывать только один параметр, он выглядел бы так:

Один конечный аргумент шаблона можно не указывать в идентификаторе шаблона с указанием явной специализации шаблона функции при условии, что он может быть выведен из типа аргумента функции.

3 голосов
/ 26 июня 2019

«a» в начале относится к любому , а не к одному .

Конечный [ny] аргумент шаблона можно не указывать в идентификатор-шаблона , в котором указывается явная специализация шаблона функции при условии, что он может быть выведен из типа аргумента функции.

Вот предложение, которое я только что составил:

Тип функционального параметра T устанавливается до const T перед предварительным анализом.

Это не значит, что настраивается только один из множества параметров, но каждый из них; если таковые имеются, так как это также может быть из-за отсутствия параметров.

«а» относится в более общем смысле к любой вещи.

...