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
问题)
这是因为语法需要它。是的
一个requires
约束不具有使用requires
表达式。它可以使用或多或少的任意布尔常量表达式。因此,requires (foo)
必须是一个合法的requires
约束。
甲requires
表达(即东西测试某些事情是否遵循一定的约束)是一种独特的构建体; 它只是由相同的关键字引入的。requires (foo f)
将是有效requires
表达式的开始。
您想要的是,如果您requires
在接受约束的地方使用,您应该能够在该requires
子句中做出“约束+表达式” 。
所以这是一个问题:如果您放置requires (foo)
在一个适合需求约束的地方...解析器必须走多远才能意识到这是一个需求约束,而不是您想要的约束+表达式成为?
考虑一下:
void bar() requires (foo)
{
//stuff
}
如果foo
是类型,则(foo)
是require表达式的参数列表,并且中的所有内容{}
都不是函数的主体,而是该requires
表达式的主体。否则,foo
是requires
子句中的表达式。
好吧,您可以说编译器应该foo
先弄清楚什么是第一。但是,当解析标记序列的基本操作要求编译器在理解标记之前先弄清楚那些标识符的含义时,C ++ 确实不喜欢它。是的,C ++是上下文相关的,因此确实会发生这种情况。但是委员会宁愿在可能的情况下避免这样做。
是的,这是语法。
本文收集自互联网,转载请注明来源。
如有侵权,请联系 [email protected] 删除。
我来说两句