带有多个模板参数的C++概念

Dan*_*elS 22 c++ templates c++-concepts

Bjarne Stroustrup最近发表了一篇关于C++ Concepts 的报告,他提到了一些让我感到惊讶的事情.示例(在第7.1节中)使用"简写模板表示法",基本上是这样的:

void foo1(auto x,auto y);                // x and y may have different types  (1)
void foo2(SomeConcept x,SomeConcept y);  // x and y must have the same type   (2)
Run Code Online (Sandbox Code Playgroud)

就我个人而言,这似乎非常违反直觉; 事实上,我希望foo2接受不同类型的值x,y,只要各个类型满足SomeConcept.请注意,程序员始终可以通过编写以下内容之一来明确指定其意图:

template <SomeConcept T> void foo2(T x, T y);                   // (3)
template <SomeConcept T1,SomeConcept T2> void foo2(T1 x,T2 y);  // (4)
Run Code Online (Sandbox Code Playgroud)

直觉上,我希望(2)中的简写符号等同于(4),因此更符合无约束模板(1)的含义.有人可以解释这个问题并解释这个设计决定背后的理由吗?

一些评论:

  • afaik,generic lambdas(在C++ 14中)已经允许类似于(1)的语法.因此,一致性要求(1)应该接受具有不同类型的输入变量,因为通用lambda就是这样做的.
  • Stroustrup在这种模板的上下文中提到了经典的"迭代器对".但是,我认为这是一个相当弱的论据,因为(i)这只是一个用例和(ii)afaik,C++ 17引入(迭代器,哨兵)对,这迫使通用代码使用两种不同的类型.

Dan*_*elS 3

对于那些标记此问题或在 Google 上找到它的人来说,只是一个快速更新。

\n\n

这里讨论的问题在 2018 年 3 月杰克逊维尔举行的 C++ 标准会议之前得到了解决(显然是默默地)。引用Botond 的旅行报告

\n\n
\n

顺便说一句,似乎没有太多讨论就已经解决的一个话题是独立决议一致决议的问题;也就是说,如果在 AFT 中对同一概念有两次使用(如void foo(Number, Number);),它们是否需要是相同的具体类型 (\xe2\x80\x9cconcient\xe2\x80\x9d),或者是两个可能不同的类型两者都对概念进行建模 (\xe2\x80\x9cindependent\xe2\x80\x9d)。Concepts TS 具有一致的分辨率,但许多人更喜欢独立的分辨率。不久前,我与人合着了一篇主张独立决议的论文;随后另一份文件以及该提案的一部分也强化了这种观点Sortable{S}。令我有些好笑的是,这个话题实际上从未被正式讨论和投票过。随着时间的推移,独立决议的想法似乎慢慢地赢得了人们的支持,以至于到了这次会议,它就被视为已成定局,事实上,任何进入 C++20 的 AFT 提案都将拥有独立的决议解决。

\n
\n