为什么默认参数在模板函数中不起作用?

Why does the default argument not work in a template function?

struct A {};

template<typename T>
void f(int n, T m = 3.14159)
{}

int main()
{    
    f(8, A{}); // ok
    f(8); // error: no matching function for call to 'f'
}

online demo

为什么默认参数在模板函数中不起作用?


编辑:我也试过跟随,想知道为什么它不起作用。

void g(int, auto = 3.14159)
{}

默认函数参数不影响模板参数推导。

您还需要模板参数的默认参数:typename T = double


至于void g(int, auto = 3.14159),好像没办法解决了

在第一种情况下,您在调用点为第二个函数参数提供了一个值,编译器可以使用它来推断第二个模板参数的类型,然后让它确定要使用哪个版本的模板实例化并调用。

在第二种情况下,您没有向编译器提供有关第二个模板参数类型的信息,因此它无法使用模板来实例化函数,因此没有可调用的具有该签名的函数。

编译器不会使用参数的默认值来推断该参数的模板参数类型(请记住,T 类型的许多选择可能会接受 double 作为默认值值)。