为什么通过构造函数部分推导类模板参数无效?

时间:2018-08-21 14:49:00

标签: c++ templates language-lawyer c++17

根据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
  1. 如果允许部分类模板参数推导,是否会产生歧义?还有其他不允许的理由吗?
  2. 将来有什么计划允许这样做吗?

0 个答案:

没有答案