pre-typedef'ing 可变参数函数指针参数

pre-typedef'ing a variadic-function-pointer argument

我有一个函数 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 使用 c++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)) {}

但我无法使初始 ("using") 版本工作,即使在显式指定模板参数并使用预制的 TFuncType<int> 作为参数时,即:

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

有人知道这里有什么吗?

使用 typedef 的 ("using") 可变参数 and/or 函数指针有什么奇怪的地方吗?

我相信这可能与我从 this answer 复制的以下文本有关,该文本本身取自 14.5.7 [temp.alias] 第 2 段中的 C++ 标准:

When a template-id refers to the specialization of an alias template, it is equivalent to the associated type obtained by substitution of its template-arguments for the template-parameters in the type-id of the alias template. [ Note: An alias template name is never deduced. — end note ]

如果我的解释是正确的,这意味着接受代码的 GCC 实际上是不符合规范的。