首页 > 后端开发 > C++ > 为什么部分类模板参数推导不可能?

为什么部分类模板参数推导不可能?

Barbara Streisand
发布: 2024-11-09 01:02:01
原创
843 人浏览过

Why is Partial Class Template Argument Deduction Not Possible?

类模板的模板参数推导:限制和含义

在 P0091 提案统一函数和模板参数推导行为之后类模板,出现一个问题:为什么部分类模板参数推导不正确可能吗?

最初的提案旨在调整扣除机制,允许在两种情况下进行部分扣除。然而,当推导的值产生多个有效的模板特化时,人们担心可能会出现混淆。一个经典的例子是元组类型的推导:通过仅指定一个参数,编译器可以推断出具有单个元素的元组,即使原始元组定义包含多个元素。

为了防止这种歧义,部分类模板参数推导已从提案中删除。此限制会影响开发人员可能希望显式指定某些模板参数而让其他模板参数被推导的场景。

例如,考虑以下类模板:

template <std::size_t S, typename T>
struct test
{
    static constexpr auto size = S;
    using type_t = T;

    test(type_t (&amp;input)[size]) : data(input) {}
    type_t (&amp;data)[size]{};
};
登录后复制

辅助函数充当用于实例化测试对象的语法糖:

template <std::size_t S, typename T>
test<S, T> helper(T (&amp;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中文网其他相关文章!

来源:php.cn
本站声明
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系admin@php.cn
作者最新文章
热门教程
更多>
最新下载
更多>
网站特效
网站源码
网站素材
前端模板