当我提供一些模板参数时,为什么C ++ 17模板类推导不起作用?

时间:2017-07-20 20:47:04

标签: c++ c++17 stdarray template-deduction

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};
                    ^

为什么?为什么我不能仅为类提供一些模板参数,但我可以为函数提供?

1 个答案:

答案 0 :(得分:0)

C ++类模板从不支持部分扣除。 一个类似的问题有recently been asked herethe 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 无论如何,我自己也注意到,即使这个方面众所周知并且我已经习惯了,新的演绎规则会以某种方式引起混乱在我的脑中,所以无论出于什么原因我开始下意识地看到这样的情况,好像我使用函数,期望与函数模板相同的行为,包括部分演绎。

如果您有同样的感受,或者根本没有感觉,我很乐意在评论中听到您的想法。