在 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)
的含义。
根据 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)
的含义。