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 实际上是不符合规范的。
我有一个函数 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 实际上是不符合规范的。