从我的角度来看,我发现了很奇怪的行为:函数默认参数不能在下面的代码中转发.
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报告相同的错误.
任何人都可以解释一下吗?
解决方法
Test是一个总是需要一个参数的函数.如果在按名称调用Test时,其带有default参数的声明是可见的,则编译器将隐式地将默认参数添加到调用中.但是,一旦将Test转换为指针或函数引用,默认参数信息就不再可见.
这可以通过创建一个函数来解决,该函数确实需要零个或一个参数,并将该信息编码到其类型中,因此它不能被销毁,如下所示:
struct Test { void operator()(int) { /* ... */ } void operator()() { operator(int{}); } } test; // ... Foo(test,0); // ok Foo(test); // ok
原文地址:https://www.jb51.cc/c/118803.html
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。