在 P1141R1 投票通过的情况下,从具有相同约束的多个推导参数中推导出多少种类型?

With P1141R1 voted in, how many types are deduced from multiple deduced parameters with the same constraint?

根据 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 was voted in (see Herb Sutter's Trip Report) 并且它重新引入了用于约束推导参数的简短语法,其中 "adjective syntax" 用于约束自动:

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

有了概念,"The appearance of auto (including Constraint auto) in a parameter list tells us that we are dealing with a function template."

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

编辑:模板类型参数参数。

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

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

An abbreviated function template is equivalent to a function template (17.6.5) whose template-parameter-list includes one invented type template-parameter for each occurrence of a placeholder type in the decl-specifier-seq of a parameter-declaration in the function’s parameter-type-list, in order of appearance.

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

此声明:

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

就是我们做所谓的"independent binding"。

这与更长的 partial-concept-id 语法相同:

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

以及更长的完整 requires-clause 语法:

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

除非您无权访问名称 _T_U(如果您需要这些类型名称,则需要求助于较长的语法选项之一)。


有关为什么 "independent binding" 比 "consistent binding" 更好的选择的冗长论据列表,请参阅 P0464:重温 foo(ConceptName, ConceptName) 的含义。