c – 扩展参数包可以为默认函数参数“填写”吗?
发布时间:2020-12-16 05:52:24 所属栏目:百科 来源:网络整理
导读:以下代码 fails to compile: #include iostreamtemplatetypename F,typename ...Argsstatic auto wrap(F func,Args... args){ return func(std::forwardArgs(args)...);}void f1(int,char,double){ std::cout "do nada1n"; }void f2(int,char='a',double=0
以下代码
fails to compile:
#include <iostream> template<typename F,typename ...Args> static auto wrap(F func,Args&&... args) { return func(std::forward<Args>(args)...); } void f1(int,char,double) { std::cout << "do nada1n"; } void f2(int,char='a',double=0.) { std::cout << "do nada2n"; } int main() { wrap(f1,1,'a',2.); wrap(f2,'a'); } g++ -std=c++14 -O2 -Wall -pedantic -pthread main.cpp && ./a.out main.cpp: In instantiation of 'auto wrap(F,Args&& ...) [with F = void(*)(int,double); Args = {int,char}]': main.cpp:22:20: required from here main.cpp:6:44: error: too few arguments to function return func(std::forward<Args>(args)...); 似乎遵循关于“参数包最后”的规则(至少在声明中),并且在扩展之后应该形成正确的函数调用:f2可以使用1,2或3个参数来调用,因此参数太少作为一个错误似乎是“苛刻的”.它也不像deduction problem(这将是我的猜测 – 但由于错误信息而摇摆不定) 这是一个缺失的功能,还是违反标准的观点? 解决方法
您不是从模板调用具有默认参数的函数.
你正在调用一个函数指针,它指向一个正好3个参数的函数,既不是更多也不少. 当然编译器抱怨失踪的第三个. 你可以用一个可变的函子做你想要做的事,since C++14 even a lambda: wrap([](auto&&... args){return f2(std::forward<decltype(args)>(args)...);},'a'); (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |