C++20 概念的一个角落是在某些情况下您必须编写 requires requires
。例如,来自 [expr.prim.req]/3 的这个例子:
requires-expression 也可以在 requires-clause ([temp]) 中使用,作为在模板参数上编写临时约束的一种方式,如下所示:
> template<typename T> > requires requires (T x) { x + x; } > T add(T a, T b) { return a + b; } > > ``` > > 第一个 requires 引入了 _requires-clause_ ,第二个引入了 _requires-expression_ 。 需要第二个 `requires` 关键字背后的技术原因是什么?为什么我们不能只允许写作:
template
requires (T x) { x + x; } T add(T a, T b) { return a + b; }
”`
(注意:请不要回答那个语法 requires
它)
原文由 Barry 发布,翻译遵循 CC BY-SA 4.0 许可协议
这是因为语法需要它。确实如此。
requires
约束 不必 使用requires
表达式。它可以使用任何或多或少的任意布尔常量表达式。因此,requires (foo)
必须是合法的requires
约束。requires
_表达式_(测试某些事物是否遵循某些约束的东西)是一个独特的构造;它只是由相同的关键字引入的。requires (foo f)
将是有效requires
表达式的开始。你想要的是,如果你在接受约束的地方使用
requires
,你应该能够从requires
子句中创建一个“约束+表达式”。所以这里的问题是:如果你把
requires (foo)
放到一个适合需求约束的地方……解析器必须走多远才能意识到这是一个需求 约束 而不是约束+表达你想要的方式?考虑一下:
如果
foo
是一个类型,那么(foo)
是一个 requires 表达式的参数列表,并且{}
中的所有内容都不是函数体而是函数体其中requires
表达式。否则,foo
是requires
子句中的表达式。好吧,你可以说编译器应该首先弄清楚
foo
是什么。但是 C++ 真的 不喜欢它,因为解析标记序列的基本行为要求编译器在理解标记之前弄清楚这些标识符的含义。是的,C++ 是上下文相关的,所以这确实发生了。但委员会倾向于尽可能避免这种情况。所以是的,这是语法。