考虑下面的小例子:不是最后一个模板参数的扣减和参数包是这个有效的代码吗?
template<typename... A, typename R>
void f(A&&..., R(*)(A...)) {}
void g(int, char) {}
int main() {
f<int, char>(42, 'c', g);
}
的参数包A
不是最后一个参数。
无论如何,我认为R
可能已经从函数指针推导出来,因为[temp.param]/11。
GCC(6.2)本agrees with me,而铛(3.9)rejects the code,并说,它不能推断出模板参数R
。
我的期望是否错误,因此GCC不应该接受它,或者是铿锵声的问题?
当原型是'R(*)(A ...),A && ...'时会发生什么?我认为'clang'是正确的,因为参数包应该吞下函数指针,因此不能推导出'R'。 – StoryTeller
@StoryTeller好点。两个编译器都接受这些代码。无论如何,这是不完全一样的。移动函数指针允许我也删除''并将'f'作为f(g,42,'c')'调用。 –
skypjack
我不确定*它是一个问题。可能只是一个GCC增强。 – StoryTeller