Влияние зависимых имен на расширения упаковки в качестве аргументов для непаковых параметров шаблонов псевдонимаC++

Программы на C++. Форум разработчиков
Ответить Пред. темаСлед. тема
Anonymous
 Влияние зависимых имен на расширения упаковки в качестве аргументов для непаковых параметров шаблонов псевдонима

Сообщение Anonymous »

Этот код создает ошибку компилятора в GCC, Clang и MSVC (это сильно уменьшенный тестовый пример для некоторого реального кода, который на самом деле делает что -то полезное): < /p>

Код: Выделить всё

#include 
#include 

template 
struct a {
template 
using f = T0;
};

template 
struct b {
template 
using f = typename a::template f;
};

static_assert(std::same_as);
int main() {
}
< /code>
ошибка: < /p>
:13:41: error: pack expansion used as argument for non-pack parameter of alias template
13 |     using f = typename a::template f;
|                                         ^~~~~
:12:5: note: in instantiation of template type alias 'f' requested here
12 |     template 
|     ^
:16:28: note: in instantiation of template class 'b' requested here
16 | static_assert(std::same_as);
|                            ^
:6:17: note: template parameter is declared here
6 | template 
|                 ^
Ссылка Godbolt: https://godbolt.org/z/thrvon7t4
Если я изменю экстремацию , чтобы быть зависимым на ts ... , затем он компилируется чисто:

Код: Выделить всё

template 
struct b {
template 
using f = typename a::template f;
};
Ссылка Godbolt: https://godbolt.org/z/sao7fzzyc
Каковы соответствующие правила, которые регулируют это различие? Другими словами, почему версия, в которой специализация зависит от TS хорошо сформирована, но версия, в которой она не является плохо сформирована?
< hr />
Вот более простой способ воспроизведения: < /p>
template
using type1 = T;

template
using type2 = type1;
< /code>
live < /p>

Ошибка: аргумент расширения упаковки для параметра без пакета 't' шаблона псевдонима 'шаблон с использованием type1 = t '

с использованием type2 = type1 ; < /p>
< /blockquote>
NB, как показано в Компилятор Explorer, проблема, по -видимому, является первым шаблоном, который является псевдонимом, как и в случае с простым классом, такой проблемы нет.


Подробнее здесь: https://stackoverflow.com/questions/794 ... k-paramete
Реклама
Ответить Пред. темаСлед. тема

Быстрый ответ

Изменение регистра текста: 
Смайлики
:) :( :oops: :roll: :wink: :muza: :clever: :sorry: :angel: :read: *x)
Ещё смайлики…
   
К этому ответу прикреплено по крайней мере одно вложение.

Если вы не хотите добавлять вложения, оставьте поля пустыми.

Максимально разрешённый размер вложения: 15 МБ.

  • Похожие темы
    Ответы
    Просмотры
    Последнее сообщение

Вернуться в «C++»