odkryłem następujące zachowanie z std::function
i typu odliczenia, co było nieoczekiwane dla mnie:Szablon odliczenie z std :: funkcja
#include <functional>
template <typename T>
void stdfunc_test(std::function<T(T)> func) {};
int test_func(int arg)
{
return arg + 2;
}
int main()
{
stdfunc_test([](int _) {return _ + 2;});
stdfunc_test(test_func);
}
Obie linie w main
w wyniku błędu:
no instance of function template "stdfunc_test" matches the argument list
Podczas próby kompilacji w programie Visual Studio 2015.
Dlaczego typ dedukcji nie odejmuje typu szablonu od typu funkcji, oraz czy istnieje obejście tego problemu?
Ani lambda ani wskaźnik funkcja jest faktycznie 'std :: zakresie funkcji - są domyślnie wymienialne na 'std :: function'. – aschepler
Czy niejawne konwersje, takie jak te, nie są brane pod uwagę podczas określania zmiennych szablonu? – redspah
Po prostu przyjmijmy, że jest to funkcja: 'template void stdfunc_test (T func)'. Następnie ogranicz zakres szablonu za pomocą SFINAE. –
rustyx