gpt4 book ai didi

c++ - 为什么我们需要需要?

转载 作者:IT老高 更新时间:2023-10-28 11:30:36 25 4
gpt4 key购买 nike

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

A requires-expression can also be used in a requires-clause ([temp]) as a way of writing ad hoc constraints on template arguments such as the one below:

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

The first requires introduces the requires-clause, and the second introduces the requires-expression.

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

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

(注意:请不要回答语法要求它)

最佳答案

这是因为语法需要它。确实如此。

requires 约束并不必须使用requires 表达式。它可以使用任何或多或少的任意 bool 常量表达式。因此,requires (foo) 必须是合法的requires 约束。

requires expression(测试某些事物是否遵循某些约束的东西)是一个独特的构造;它只是由相同的关键字引入的。 requires (foo f) 将是有效 requires 表达式的开头。

你想要的是,如果你在接受约束的地方使用 requires,你应该能够从 requires 子句中制作一个“约束+表达式” .

所以问题来了:如果你把 requires (foo) 放到一个适合 requires 约束的地方...解析器必须走多远才能意识到这是a 需要 约束 而不是你想要的约束+表达式?

考虑一下:

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

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

嗯,你可以说编译器应该首先弄清楚 foo 是什么。但是 C++ 真的 不喜欢它,因为解析标记序列的基本行为需要编译器在理解标记之前弄清楚这些标识符的含义。是的,C++ 是上下文相关的,所以这确实发生了。但委员会倾向于尽可能避免这种情况。

所以是的,这是语法。

关于c++ - 为什么我们需要需要?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/54200988/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com