以下代码
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 nada1\n"; } void f2(int,char='a',double=0.) { std::cout << "do nada2\n"; } 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(这将是我的猜测 – 但由于错误信息而摇摆不定)
这是一个缺失的功能,还是违反标准的观点?