C++ 可以从默认值推断参数类型吗?

Can C++ deduce argument type from default value?

我尝试使用默认模板参数编写此函数:

template<typename A, typename B>
void func(int i1, int i2, A a, B b = 123){
    ...
}

在我看来,我可以这样称呼它:func(1, 2, 3) 并且编译器应该从默认值中将类型 B 推断为 int,但我得到 no instance of overloaded function
在这种情况下,C++ 构造是否不正确,编译器无法推断类型?

无法从默认参数推导出函数中模板参数的类型。如 cppreference.com 上的示例所示:

Type template parameter cannot be deduced from the type of a function default argument:

template<typename T> void f(T = 5, T = 7); 

void g()
{
    f(1);     // OK: calls f<int>(1, 7)
    f();      // error: cannot deduce T
    f<int>(); // OK: calls f<int>(5, 7)
}

但是,您可以为模板参数指定一个默认参数:

template<typename A, typename B = int>
void func(int i1, int i2, A a, B b = 123){
    ...
}

通常当默认参数不起作用时,您可以使用重载:

template<typename A, typename B>
void func(int i1, int i2, A a, B b){
    ...
}
template<typename A>
void func(int i1, int i2, A a){
    func(i1,i2,a,123);
}