Variadic Templates Parameter Matching in der STD :: Funktion

Ich habe folgenden Code:

#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));
}

Ich habe 2 Fragen:

1. Ich verstehe nicht warum die Leitung funktioniertfunc<void, double>(f); Gib mir einen Kompilierungsfehler

/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.

wohingegen wenn ich den parameter umsetzef zu einemstd::function (wie in der nicht kommentierten Zeile) funktioniert es.

2. Und das verwirrendste Problem ist das, wenn ich eine nicht-variadische Version von benutzefunc (d. h. nur ersetzentypename... durchtypename also in der Tatfunc nimmt einstd::function<Return(Params)> als Parameter), dann die kommentierte Zeile inmain funktioniert wie gewünscht. Irgendwelche Ideen warum?

Antworten auf die Frage(1)

Ihre Antwort auf die Frage