Должен ли "вывод аргументов шаблона для шаблонов классов" выводить пустые пакеты параметров для шаблонов классов с переменным числом аргументов?
Предложение "Вычет аргументов шаблона для шаблонов классов" ( P0091R2) содержит следующий пример:
template<class ... Ts> struct X { X(Ts...) };
X x1{1}; // OK X<int>
X x11; // OK X<>
(Помимо того факта, что в определении конструктора отсутствует тело), пример, по-видимому, предполагает, что шаблон класса variadic, созданный с нулевым аргументом, будет выведен с пустым пакетом параметров.
К сожалению, последняя версия g++ не согласна:
int main()
{
X x1{1};
X x11;
}
In function 'int main()':
error: invalid use of template-name 'X' without an argument list
X x11;
^
note: class template argument deduction requires an initializer
Я не смог найти четкую формулировку в предложении, которая проясняет это взаимодействие. G ++ здесь не так?
1 ответ
Теперь это правильно сформировано после того, как P0620R0 снял упомянутое ограничение прямо перед публикацией C++17.
Предыдущий ответ сохраняется для справки:
N4618 [dcl.type.class.deduct] / 1:
Если заполнитель для выведенного типа класса появляется в качестве decl-спецификатора в decl-specier-seq простого объявления, init-декларатор этого объявления должен иметь форму
Заявитель-идентификатор- атрибут-спецификатор-seqopt инициализатор
Инициализатор не является обязательным.