Должен ли "вывод аргументов шаблона для шаблонов классов" выводить пустые пакеты параметров для шаблонов классов с переменным числом аргументов?

Предложение "Вычет аргументов шаблона для шаблонов классов" ( 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

пример на wandbox


Я не смог найти четкую формулировку в предложении, которая проясняет это взаимодействие. G ++ здесь не так?

1 ответ

Решение

Теперь это правильно сформировано после того, как P0620R0 снял упомянутое ограничение прямо перед публикацией C++17.

Предыдущий ответ сохраняется для справки:


N4618 [dcl.type.class.deduct] / 1:

Если заполнитель для выведенного типа класса появляется в качестве decl-спецификатора в decl-specier-seq простого объявления, init-декларатор этого объявления должен иметь форму

Заявитель-идентификатор- атрибут-спецификатор-seqopt инициализатор

Инициализатор не является обязательным.

Другие вопросы по тегам