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

Dav*_*1ar 30 c++ templates default default-arguments template-argument-deduction

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

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

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

son*_*yao 46

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

类型模板形参不能从函数默认实参的类型推导出来:

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)
}
Run Code Online (Sandbox Code Playgroud)

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

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

  • @Deduplicator Braced-init-list 属于非推导上下文,因此不会发生推导,而是使用默认参数 int 。然后“{}”作为参数传递,类型为“int”的参数“b”被初始化为值“0”。 (2认同)

for*_*818 12

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

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);
}
Run Code Online (Sandbox Code Playgroud)