соответствие параметров шаблонов переменных в 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 работает по желанию. Есть идеи почему?

Ответы на вопрос(1)

Ваш ответ на вопрос