使用类型别名的可变参数模板推导
Variadic template deduction using type alias
我有这样一个程序:
template<typename ...Args>
using Function = void(*)(Args *...);
template<typename ...Args>
void DoThing(Function<Args...> func) { }
void IntFunction(int *i) { }
int main(int argc, char *argv[]) {
DoThing(IntFunction);
}
当我 运行 程序时出现此错误
$ clang++ -std=c++14 template.cpp
template.cpp:12:3: error: no matching function for call to 'DoThing'
DoThing(IntFunction);
^~~~~~~
template.cpp:7:6: note: candidate template ignored: substitution failure [with Args = int]
void DoThing(Function<Args...> func) { }
^
1 error generated.
但是如果我使用 g++ 编译它,我不会收到任何错误。
在类型别名中使用时,clang 似乎无法推导可变参数模板参数。如果我用标准参数替换可变参数,那么我就不会再收到错误了。
哪个编译器给我正确的结果?为什么不允许我这样做?
可以减少到
template <typename... T>
using funptr = void(*)(T...);
template <typename... T>
void f(funptr<T...>) {}
template void f(void(*)());
这是有效代码;如果我们用相应的包扩展替换 funptr<T...>
,Clang 突然不再抱怨了。
报告为#25250。
我有这样一个程序:
template<typename ...Args>
using Function = void(*)(Args *...);
template<typename ...Args>
void DoThing(Function<Args...> func) { }
void IntFunction(int *i) { }
int main(int argc, char *argv[]) {
DoThing(IntFunction);
}
当我 运行 程序时出现此错误
$ clang++ -std=c++14 template.cpp
template.cpp:12:3: error: no matching function for call to 'DoThing'
DoThing(IntFunction);
^~~~~~~
template.cpp:7:6: note: candidate template ignored: substitution failure [with Args = int]
void DoThing(Function<Args...> func) { }
^
1 error generated.
但是如果我使用 g++ 编译它,我不会收到任何错误。
在类型别名中使用时,clang 似乎无法推导可变参数模板参数。如果我用标准参数替换可变参数,那么我就不会再收到错误了。
哪个编译器给我正确的结果?为什么不允许我这样做?
可以减少到
template <typename... T>
using funptr = void(*)(T...);
template <typename... T>
void f(funptr<T...>) {}
template void f(void(*)());
这是有效代码;如果我们用相应的包扩展替换 funptr<T...>
,Clang 突然不再抱怨了。
报告为#25250。