У всех пакетов параметров шаблона есть "пусто" как их значение по умолчанию? - PullRequest
0 голосов
/ 18 ноября 2018

Посмотрите на следующий код, который, очевидно, и GCC, и Clang рады принять: [ coliru ]:

template <class ... P1, class T1, class ... P2, class T2, class ... P3>
constexpr int f(T1, T2) {
    return sizeof...(P1) + sizeof...(P2) + sizeof...(P3);
}
int main() {
    static_assert(f(12, 3.4) == 0);
}

Почему это компилируется? Есть ли в стандарте правило, гласящее, что когда пакет параметров шаблона не может быть выведен, он считается пустым?

1 Ответ

0 голосов
/ 18 ноября 2018

[temp.param] 17.1 / 15 намеревается сделать ваш код некорректным, основываясь на примере:

 // U can be neither deduced from the parameter-type-list nor specified
 template<class... T, class... U> void f() { } // error

Но текст немного неясен:

Если шаблон-параметр шаблона класса, шаблона переменной или шаблона псевдонима имеет шаблон по умолчанию, аргумент, каждый последующий шаблон-параметр должен либо иметь заданный по умолчанию шаблон-аргумент, либо быть пакет параметров шаблона. Если шаблон-параметр шаблона первичного класса, шаблона первичной переменной или alias template - это пакет параметров шаблона, он должен быть последним параметром шаблона. Параметр шаблона Пакет шаблона функции не должен сопровождаться другим параметром шаблона, если только этот шаблон Параметр может быть выведен из списка параметров-типов (11.3.5) шаблона функции или имеет значение по умолчанию аргумент (17.9.2). Параметр шаблона шаблона руководства по вычетам (17.10), который не имеет значения по умолчанию Аргумент должен быть выведен из списка параметров-типов шаблона руководства по выводам.

Проблема в том, что пакет параметров шаблона не параметр шаблона ; в то время как T..., U... запрещен для шаблонных классов, формулировка, блокирующая его из функции шаблона, выглядит немного неправильно.

Вы также можете утверждать, что невозможность передачи типов в эти пакеты имеет следующие значения:

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

но это серьезное натяжение.

...