【发布时间】:2015-11-13 17:56:17
【问题描述】:
这是一个触发编译错误的最小示例:
#include <utility>
void foo(int, double, int)
{}
template <class... Args>
void post_forwarder(void(*fun)(Args..., int), Args&&... aArgs)
{
fun(std::forward<Args>(aArgs)..., 5);
}
int main()
{
post_forwarder(foo, 6, 6.1); // Compilation error on instantiation
return 0;
}
我怀疑问题与可变参数模板参数在固定 int 参数之前的函数类型中扩展的事实有关,但如果是这种情况,我找不到很好的理由。
Clang 3.6报的错误是:
error: no matching function for call to 'post_forwarder'
note: candidate template ignored: failed template argument deduction
【问题讨论】:
-
你能发布错误吗?这会很有帮助。
-
顺便说一句,推断
Args&&...转发到预期的函数指针Args...不是一个好计划。只要确保你知道这一点。 -
@Yakk 我必须承认我真的可以使用更多关于你提出的观点的细节:)
-
@adn 转发引用类型很少与您在完全不同的代码中用于表示变量的完全相同。您正在使用来自变量
A...的转发引用推导类型来匹配不是从这些变量生成的函数指针。想想转发rsference推导的4种情况,对应的函数指针一定是什么类型。如果这没有意义,请复习一下转发引用做了什么(这不是魔术),或者在除了最简单的上下文之外停止使用它们。
标签: c++ templates c++11 variadic-templates