соответствие параметров шаблонов переменных в std :: function
У меня есть следующий код:
#include <iostream>
#include <functional>
template<typename Return, typename... Params>
void func(std::function<Return(Params... )> x) {}
void f(double) {}
int main() {
//func<void, double>(f); // compile error here in the variadic case
func(std::function<void(double)>(f));
}
У меня есть 2 вопроса:
1. Я не понимаю, почему линияfunc<void, double>(f);
дай мне ошибку компиляции
/Users/vlad/minimal.cpp:10:5: error: no matching function for call to 'func'
func<void, double>(f); // compile error here in the variadic case
^~~~~~~~~~~~~~~~~~
/Users/vlad/minimal.cpp:5:6: note: candidate template ignored: could not match 'function<void (double, type-parameter-0-1...)>' against 'void (*)(double)'
void func(std::function<Return(Params... )> x) {}
^
1 error generated.
тогда как, если я приведу параметрf
кstd::function
(как в строке без комментариев) это работает.
2. И самая загадочная проблема заключается в том, что, если я использую не вариационную версиюfunc
(т.е. просто заменитьtypename...
отtypename
так в действительностиfunc
занимаетstd::function<Return(Params)>
в качестве параметра), то закомментированная строка вmain
работает по желанию. Есть идеи почему?