类模板的模板参数推导:限制和含义
在 P0091 提案统一函数和模板参数推导行为之后类模板,出现一个问题:为什么部分类模板参数推导不正确可能吗?
最初的提案旨在调整扣除机制,允许在两种情况下进行部分扣除。然而,当推导的值产生多个有效的模板特化时,人们担心可能会出现混淆。一个经典的例子是元组类型的推导:通过仅指定一个参数,编译器可以推断出具有单个元素的元组,即使原始元组定义包含多个元素。
为了防止这种歧义,部分类模板参数推导已从提案中删除。此限制会影响开发人员可能希望显式指定某些模板参数而让其他模板参数被推导的场景。
例如,考虑以下类模板:
template <std::size_t S, typename T> struct test { static constexpr auto size = S; using type_t = T; test(type_t (&input)[size]) : data(input) {} type_t (&data)[size]{}; };
辅助函数充当用于实例化测试对象的语法糖:
template <std::size_t S, typename T> test<S, T> helper(T (&input)[S]) { return input; }
当使用带有预先声明的帮助器时array:
int buffer[5]; auto a = helper<5, int>(buffer); // No deduction auto b = helper<5>(buffer); // Type deduced auto c = helper(buffer); // Type and size deduced
在类模板的情况下不支持部分推导,auto b = helper(buffer); 的失败证明了这一点。编译器无法从参数推断出 T 参数,从而导致编译错误。相反,auto c = helper(buffer);成功推导了 S 和 T,证明了显式指定所有模板参数的必要性。
以上是为什么部分类模板参数推导不可能?的详细内容。更多信息请关注PHP中文网其他相关文章!