为什么我们需要需求?

巴里:

C ++ 20概念的角落之一是在某些情况下您必须编写requires requires例如,此示例来自[expr.prim.req] / 3

需要表达也可以在使用需要子句([温度])作为写在模板参数特设约束,如下面的一个的一种方法:

template<typename T>
  requires requires (T x) { x + x; }
    T add(T a, T b) { return a + b; }

第一个需求介绍了require-子句,第二个需求介绍了require-expression

需要第二个requires关键字的技术原因是什么我们为什么不能只允许写作:

template<typename T>
  requires (T x) { x + x; }
    T add(T a, T b) { return a + b; }

(注意:请不要回答语法requires问题)

尼科尔·波拉斯(Nicol Bolas):

这是因为语法需要它。是的

一个requires约束不具有使用requires表达式。它可以使用或多或少的任意布尔常量表达式。因此,requires (foo)必须是一个合法的requires约束。

requires 表达(即东西测试某些事情是否遵循一定的约束)是一种独特的构建体; 它只是由相同的关键字引入的。requires (foo f)将是有效requires表达式的开始

您想要的是,如果您requires在接受约束的地方使用,您应该能够在该requires子句中做出“约束+表达式”

所以这是一个问题:如果您放置requires (foo)在一个适合需求约束的地方...解析器必须走多远才能意识到这是一个需求约束,而不是您想要的约束+表达式成为?

考虑一下:

void bar() requires (foo)
{
  //stuff
}

如果foo是类型,则(foo)是require表达式的参数列表,并且中的所有内容{}都不是函数的主体,而是该requires表达式的主体否则,foorequires子句中的表达式

好吧,您可以说编译器应该foo弄清楚什么是第一。但是,当解析标记序列的基本操作要求编译器在理解标记之前先弄清楚那些标识符的含义时,C ++ 确实不喜欢它。是的,C ++是上下文相关的,因此确实会发生这种情况。但是委员会宁愿在可能的情况下避免这样做。

是的,这是语法。

本文收集自互联网,转载请注明来源。

如有侵权,请联系 [email protected] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章