Pre-typedef'ing аргумент указателя переменной-функции

У меня есть функция foo, которая принимает указатель на переменную функцию в качестве аргумента.

Я хотел бы использовать "using" для определения типа аргумента до объявления функции.

template <typename ... vARGS>
using TFuncType = void(*)(vARGS ... V_args);

template <typename ... vARGS>
void foo(TFuncType<vARGS ...> funcptr) {}

void bar(int i) {}

int main() {
  foo(&bar); // This line fails to compile.
}

Это не компилируется. Ошибка (через clang с использованием С++ 1z):

/make/proj/test/variadic-funcparam-deduce2.cpp:39:5: error: no matching function for call to 'foo'
foo(&bar);
^~~
/make/proj/test/variadic-funcparam-deduce2.cpp:33:36: note: candidate template ignored: substitution failure [with vARGS = int]
template <typename ... vARGS> void foo(TFuncType<vARGS ...> funcptr) {}

Почему происходит сбой "int"?

Я могу успешно скомпилировать, если я явно напишу тип внутри foo():

template <typename ... vARGS>
void foo(void(*funcptr)(vARGS ... V_args)) {}

Но я не могу заставить начальную ( "использующую" ) версию работать даже при явном указании параметров шаблона и использовании предварительно заданного TFuncType<int> для аргумента, т.е.

int main() {
  TF_call<int> fptr = &bar; // This line is OK.
  foo<int>(fptr);
}

Кто-нибудь знает, что здесь?

Есть ли что-то странное в использовании переменных typedef'd ( "using" ) и/или указателей функций, которые мне не хватает?

Ответы

Ответ 1

Я считаю, что это может быть связано со следующим текстом, который я скопировал из этого ответа, который сам берет из стандарта С++ в пункте 14.5.7 [temp.alias] 2:

Когда идентификатор шаблона относится к специализации шаблона псевдонимов, это эквивалентно ассоциированному типу, полученному заменой его шаблонные аргументы для параметров шаблона в идентификаторе типа шаблон псевдонима. [Примечание. Имя шаблона псевдонима никогда не выводится. - end note]

Если я интерпретирую это право, это означает, что GCC, принимающий код, фактически несоответствует.