C++ 20概念的角落之一是,在某些情况下,您必须编写requires requires
。例如,此示例来自[expr.prim.req]/3:
需要第二个requires
关键字的技术原因是什么?我们为什么不能只允许写作:
template<typename T>
requires (T x) { x + x; }
T add(T a, T b) { return a + b; }
(注意:请不要回答
requires
语法) 最佳答案
这是因为语法需要它。是的requires
约束不必使用requires
表达式。它可以使用或多或少的任意 bool 常量表达式。因此,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++是上下文相关的,因此确实会发生这种情况。但是委员会希望尽可能避免这样做。是的,这是语法。
关于c++ - 为什么我们需要需求?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/54200988/