【问题标题】:With P1141R1 voted in, how many types are deduced from multiple deduced parameters with the same constraint?P1141R1 投票后,从多个推导参数中推导出多少种类型?
【发布时间】:2019-04-17 02:03:28
【问题描述】:

根据Concepts TS,虽然一个无约束的推导参数每次都会产生新的模板类型参数,但受约束的推导参数每个约束只产生一个模板类型参数:

[](auto a, auto b) // IS-A
[]<class ArgA, class ArgB>(ArgA a, ArgB b)

[](Constraint a, Constraint b) // IS-A
[]<Constraint Type>(Type a, Type b)

现在,P1141R1 被投票(参见Herb Sutter's Trip Report),它重新引入了用于约束自动的“形容词语法”的约束推导参数的简短语法:

void fun(Constraint auto a, Constraint auto b);

概念,“auto(包括Constraint auto)在参数列表中的出现告诉我们我们正在处理一个函数模板。”

但是,没有关于这种语法会产生多少种不同类型的信息。所以,问题是:对于两个具有相同约束(如上)的约束推导参数,是否存在具有一个类型参数的模板,或者由于auto关键字的存在而放宽了规则?

编辑:模板类型argument参数。

【问题讨论】:

    标签: c++ template-meta-programming c++-concepts c++20


    【解决方案1】:

    人们真的应该停止编写带有过时论文链接的误导性旅行报告,至少没有一个巨大的闪烁霓虹粉红色免责声明。投票的论文是 P1141R2,将在几周内公开发布。批准的设计大致是 P1141R1 的第 1、3 和 4 部分。

    您将获得独立的绑定,即示例中的两个模板参数:

    缩写函数模板等价于函数模板 (17.6.5) 其 template-parameter-list 包含一种发明类型 template-parameter 用于每次出现的占位符类型 decl-specifier-seq 在函数的 parameter-declaration 参数类型列表,按出现顺序排列。

    至少从今年年初开始,这就是预期的方向。

    【讨论】:

    • "人们真的应该停止撰写带有过时论文链接的误导性旅行报告,至少不要使用巨大的霓虹粉色免责声明。" 好吧,也许委员会实际上应该把这些及时提交论文,而不是等待几个来更新一些网络链接。 C++ 用户希望/应该快速知道会议上发生了什么,而不是在几周后有人开始讨论它。如果他们懒得快速更新链接,那么他们应该不会对试图通知社区的人链接到旧论文感到惊讶。
    • R2只是增加了措辞——真正的问题是“独立绑定”只是被默认为一年的方向,所以P1141(措辞之外)从来没有引起人们的注意。跨度>
    • @Barry 它还淘汰了五个部分中的两个。帖子中没有提到这一点。
    • @T.C.是的,那很公平:-)
    【解决方案2】:

    此声明:

    void fun(Constraint auto a, Constraint auto b);
    

    意思是我们做所谓的“独立绑定”。

    这与较长的 partial-concept-id 语法含义相同:

    template <Constraint _T, Constraint _U>
    void fun(_T a, _U b);
    

    还有更长的完整 requires 子句语法:

    template <typename _T, typename _U>
        requires Constraint<_T> && Constraint<_U>
    void fun(_T a, _U b);
    

    除了您无权访问名称_T_U(如果您需要这些类型名称,您将需要使用较长的语法选项之一)。


    有关为什么“独立绑定”比“一致绑定”更好的选择的冗长参数列表,请参阅P0464:重新审视foo(ConceptName, ConceptName) 的含义。

    【讨论】:

    • 而且它们在技术上并不是一回事(功能等同但不等同),这是与 TS 相比的另一个变化。
    • @T.C. TS 让它们实际上是等价的吗?就像我可以声明简洁并定义不简洁一样?
    • 确实如此。他们在合并 TS 时将其取出。
    猜你喜欢
    • 2019-02-09
    • 1970-01-01
    • 2015-09-19
    • 1970-01-01
    • 2017-05-06
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多