Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/templates/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/visual-studio-2012/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++;具有多个模板参数的概念 Bjarne Stroustrup最近发表了一篇关于C++概念的文章,他提到了一些让我感到惊讶的事情。该示例(在第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)_C++_Templates_C++ Concepts - Fatal编程技术网

C++;具有多个模板参数的概念 Bjarne Stroustrup最近发表了一篇关于C++概念的文章,他提到了一些让我感到惊讶的事情。该示例(在第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)

C++;具有多个模板参数的概念 Bjarne Stroustrup最近发表了一篇关于C++概念的文章,他提到了一些让我感到惊讶的事情。该示例(在第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),c++,templates,c++-concepts,C++,Templates,C++ Concepts,对我个人来说,这似乎非常违反直觉;事实上,我希望foo2接受不同类型的值x,y,只要相应的类型满足某种概念。请注意,程序员始终可以通过编写以下内容之一明确指定其意图: template <SomeConcept T> void foo2(T x, T y); // (3) template <SomeConcept T1,SomeConcept T2> void foo2(T1 x,T2 y); // (4) 模板void foo2

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

template <SomeConcept T> void foo2(T x, T y);                   // (3)
template <SomeConcept T1,SomeConcept T2> void foo2(T1 x,T2 y);  // (4)
模板void foo2(tx,ty);//(3)
模板void foo2(T1 x,t2y);//(4)
直觉上,我希望(2)中的简写符号等同于(4),因此与无约束模板(1)的含义更加一致。有人能解释一下这个问题,并解释一下这个设计声明背后的基本原理吗

一些评论:

  • afaik,通用lambda(在C++14中)已经允许类似于(1)的语法。因此,一致性要求(1)应该接受不同类型的输入变量,因为泛型lambda会这样做
  • Stroustrup在此类模板的上下文中提到了经典的“迭代器对”。然而,我认为这是一个相当弱的论点,因为(I)这只是一个用例,(ii)afaik,C++17引入了(迭代器,sentinel)对,这迫使泛型代码使用两种不同的类型

我能找到的最早在当前概念提案中提到简洁语法的论文是,§6.2.2提供了这一基本原理:

如果我们需要相同概念的两种参数类型呢?考虑

void sort(Ran p, Ran q);
为了使这一点有意义,
p
q
必须是相同的类型,这是规则。默认情况下,如果两个参数使用相同的受约束参数名称,则这些参数的类型必须相同。我们选择重复使用受约束的参数名称暗示“相同类型”,因为(在大多数环境中)这是最常见的情况,这里的目的是优化 最简单情况的简洁表示法。此外,受约束的参数是名称 一个类型的,并且有两个类型名表示同一作用域中的不同类型 会引起混乱

托尼·范艾尔德和波顿·巴洛提议改变这一含义:。本文提供了两个支持当前含义的论点,一个类似于Sutton等人提出的论点,另一个是正交论点:

使用频率
可以说,如果函数接受两个类型可能不同、满足相同概念的参数,而这两种类型之间又没有其他关系,那么您通常不希望函数接受这两个类型的参数

与定义检查的交互
也可以说,这一变化将鼓励模板作者在受约束的模板下编写,因为他们将选择使用简练的
R foo(ConceptName,ConceptName)表单,即使在参数类型上存在附加约束的情况下也是如此。欠约束模板的激增将使引入定义检查变得更加困难,因为欠约束模板将无法通过定义检查



我不熟悉支持当前语法的任何其他论点,但如果你是,请随时给Tony和Botond发电子邮件,以便将其纳入他们的论文中

对于那些为这个问题添加标签或在谷歌上找到它的人来说,这只是一个快速更新

在2018年3月的杰克逊维尔C++标准会议之前,这里讨论的问题被解决了——显然是默默无闻的。引自:

另一方面,一个似乎没有经过太多讨论就解决了的话题是独立解决与一致解决的问题;也就是说,如果您在AFT中有两个相同概念的用法(如在
void foo(Number,Number);
),它们是否需要是相同的具体类型(“一致”),或者两个潜在的不同类型,这两个类型都模拟了该概念(“独立”)。概念TS具有一致的分辨率,但许多人更喜欢独立分辨率。不久前,我与人合著了一篇主张独立解决的论文;随后,另一份文件以及
可排序{S}提案的一节加强了这种看法。让我有点好笑的是,这个话题从来没有被正式讨论和表决过;独立决议的想法似乎只是慢慢地,随着时间的推移,赢得了人们的支持,因此,通过这次会议,它被视为一种已完成的交易,任何进入C++20的AFT提案实际上都将有独立的决议


我同意这是违反直觉的。我真的很想要缩写语法,只要它允许相同概念的不同类型。注意,论文主要代表作者的观点,不一定代表委员会的观点。我认为委员会在概念上还远远没有达成一致意见(从过去的邮件中可以看出)。最终会发生什么仍有待观察;你要找的是已经通过的委员会提案。同样的规则在当前版本的概念TS中有说明(§8.3.5,第22页):谢谢你的回复。事实上,在我提出最初的问题一段时间后,我发现了博顿的建议,我希望它得到委员会的支持。就我个人而言,主要论点是与“auto”语法的一致性,但波顿似乎已经在他的提案中说明了这一点。应该注意的是,圣地亚哥会议上实际批准的版本遵循了这一点:每个参数都独立于所有其他参数。应该是这样的,
void f(概念x)语法是(影响最终结果),然后使用
auto
和(实际上是默认的)“独立解析”。@nicolas那么,当您尝试将两个参数转发到另一个时会发生什么