C ++ 17引入了class template argument deduction。虽然大部分时间它只不过是一种语法糖,但有些情况下它才能真正解决,特别是在通用代码中,例如in this case。
此功能的另一个不错的应用是使用std::array
。事实上,现在它只会减少疼痛,只需比较这两个版本:
std::array arr{ 1, 2, 3, 4, 5 }; // with C++17 template argument deduction
std::array<int, 5> arr{ 1, 2, 3, 4, 5 }; // just a normal C++11 std::array
事实上,一旦我决定添加一个元素,我就可以在不明确将类型更改为std::array<int, 6>
的情况下执行此操作。
但是,以下内容无法编译:
std::array arr{ 1, 2, 3.f, 4, 5 };
模板参数推导失败是有道理的,产生如下错误:
main.cpp:7:26: error: class template argument deduction failed:
std::array arr{2,4.,5}; // will not compile
但是,当我尝试提示时,它并没有解决问题:
std::array<float> arr{ 1, 2, 3.f, 4, 5 }; // will not compile as well
现在,编译器错误消息指出以下内容:
main.cpp:7:21: error: wrong number of template arguments (1, should be 2)
std::array<float> arr{2,4.,5};
^
为什么?为什么我不能仅为类提供一些模板参数,但我可以为函数提供?
答案 0 :(得分:0)
C ++类模板从不支持部分扣除。 一个类似的问题有recently been asked here,the accepted answer表示部分扣除已包含在原始提案中,但没有出现在标准中。
鉴于此,编译器错误看起来是合乎逻辑的。
此外,在我的问题in the section "Notes"中引用的CppReference页面上描述了这种情况:
std::tuple t(1, 2, 3); // OK: deduction std::tuple<int,int,int> t(1, 2, 3); // OK: all arguments are provided std::tuple<int> t(1, 2, 3); // Error: partial deduction
PS 无论如何,我自己也注意到,即使这个方面众所周知并且我已经习惯了,新的演绎规则会以某种方式引起混乱在我的脑中,所以无论出于什么原因我开始下意识地看到这样的情况,好像我使用函数,期望与函数模板相同的行为,包括部分演绎。
如果您有同样的感受,或者根本没有感觉,我很乐意在评论中听到您的想法。