Рассмотрим следующий код:
template<typename F>
struct S;
template<typename Ret, typename... Args>
struct S<Ret(Args...)> { };
template<typename... Args>
using Alias = S<void(Args...)>;
int main() {
S<void(int)> s;
Alias<int> alias;
}
Он работает нормально, как и ожидалось, и обе строки, включающие S
, и строка, включающая Alias
, определяют под капотом один и тот же тип S<void(int)>
.
Теперь рассмотрим следующие изменения:
int main() {
S<void(void)> s; // this line compiles
Alias<void> alias; // this line does not
}
Я ожидал, что он скомпилируется по причинам, аналогичным упомянутым выше.
Само собой разумеется, что он не скомпилируется из-за строки, содержащей Alias
, вместо этого я получаю сообщение об ошибке:
Вместо «шаблона с использованием псевдонима = S [с аргументами = {void}]»
[...]
ошибка: неверный тип параметра 'void'
Вопрос довольно простой: что я здесь пропустил?