何时要求子句表达式需要加括号?(偶然的双关语)

bol*_*lov 4 c++ c++20 requires-clause

这给出了一个错误:

template <class T, T A, T B>
    requires A > B             // <-- error
class X{};
Run Code Online (Sandbox Code Playgroud)

错误:requires 子句中的该表达式周围需要括号

requires A < B

         ~~^~~

         (    )
Run Code Online (Sandbox Code Playgroud)

几乎所有操作员都会出现此错误 ( requires A > B, requires A == B, requires A & B, requires !A)

然而&&并且||似乎有效:

template <class T, T A, T B>
    requires A && B             // <-- ok
class X{};
Run Code Online (Sandbox Code Playgroud)

在 godbolt 上使用 gcc trunk 和 clang trunk(2020 年 5 月)进行睾丸测试。两个编译器给出相同的结果。

T.C*_*.C. 5

Requires 子句使用特殊的表达式语法来避免某些病态的解析歧义。如cppreference 中所述,允许的形式是

  • 主要表达
  • 用运算符连接的主要表达式序列&&
  • 用运算符连接的上述表达式序列||