Рассмотрим следующий код:
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
, вместо этого я получаю ошибку:
При замене шаблона с использованием Alias = S [с помощью Args = {void}] '
[...]
ошибка: недопустимый тип параметра 'void'
Вопрос довольно прост: что я пропустил здесь?