为什么函数默认参数不能在C中转发?

从我的角度来看,我发现了很奇怪的行为:函数认参数不能在下面的代码中转发.
void Test(int test = int{}) {}

template<typename F,typename ...Args>
void Foo(F&& f,Args&&... args)
{
    std::forward<F>(f)(std::forward<Args>(args)...);
}

int main()
{
    Foo(Test,0); // This compiles
    Foo(Test);    // This doesn't compile
}

Clang报道:
错误函数调用的参数太少,预期为1,为0
GCC和VC报告相同的错误.

任何人都可以解释一下吗?

代码在这里
http://rextester.com/live/JOCY22484

解决方法

Test是一个总是需要一个参数的函数.如果在按名称调用Test时,其带有default参数的声明是可见的,则编译器将隐式地将认参数添加调用中.但是,一旦将Test转换为指针或函数引用,认参数信息就不再可见.

这可以通过创建一个函数解决,该函数确实需要零个或一个参数,并将该信息编码到其类型中,因此它不能被销毁,如下所示:

struct Test {
    void operator()(int) { /* ... */ }
    void operator()() { operator(int{}); }
} test;
// ...
Foo(test,0); // ok
Foo(test);    // ok

相关文章

本程序的编译和运行环境如下(如果有运行方面的问题欢迎在评...
水了一学期的院选修,万万没想到期末考试还有比较硬核的编程...
补充一下,先前文章末尾给出的下载链接的完整代码含有部分C&...
思路如标题所说采用模N取余法,难点是这个除法过程如何实现。...
本篇博客有更新!!!更新后效果图如下: 文章末尾的完整代码...
刚开始学习模块化程序设计时,估计大家都被形参和实参搞迷糊...