根据cppreference.com:
仅当不存在模板参数列表时才执行类模板参数推导。如果指定了模板参数列表,则不会进行推导。 (cppreference.com)
我想知道为什么要做出这个决定。
以下示例演示了该问题:
template<typename t1, typename t2>
struct Foo {
Foo(t2 value) {}
};
Foo a{5}; //Error: Can't deduce all template parameters
Foo<float> b{5}; //Error: Compiler does (conformingly) not deduce t2
Foo<float, int> c{5}; //Ok
这特别令人讨厌,因为我可以很容易地编写这样的帮助函数:
template<typename t1, typename t2>
auto makeFoo(t2 value) {
return Foo<t1, t2>(value);
}
auto d(makeFoo<float>(5)); //Ok: Partial deduction works for functions